我经常会遇到文本文件(例如我母语的字幕文件,波斯语) 存在字符编码问题。这些文件是在 Windows 上创建的,并使用不合适的编码(似乎是 ANSI)保存,看起来乱七八糟,无法阅读,如下所示:
在 Windows 中,可以使用以下方法轻松修复此问题记事本++将编码转换为 UTF-8,如下所示:
正确可读的结果是这样的:
我在 GNU/Linux 上搜索了很多类似的解决方案,但不幸的是,建议的解决方案(例如这个问题)不起作用。最重要的是,我见过有人建议iconv
和recode
但我使用这些工具时运气不佳。我测试了许多命令,包括以下命令,但都失败了:
$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt
这些都不起作用!
我正在使用 Ubuntu-14.04,正在寻找一个像 Notepad++ 一样工作的简单解决方案(GUI 或 CLI)。
的一个重要方面是“简单的”是用户不需要确定源编码;相反,源编码应该由工具自动检测,用户只需提供目标编码。但尽管如此,我也很高兴知道一个需要提供源编码的可行解决方案。
如果有人需要一个测试用例来检查不同的解决方案,那么上面的示例是可以访问的通过此链接。
答案1
这些带有波斯语文本的 Windows 文件被编码为Windows-1256。因此,可以使用与 OP 尝试过的命令进行解密,但使用不同的字符集。即:
recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(谴责原始发帖人的投诉;见评论)
iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt
这里假设 LANG 环境变量设置为 UTF-8 语言环境。要转换为任何编码(UTF-8 或其他),而不管当前语言环境如何,可以这样写:
iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}
原始海报还与文本重新编码工具(recode,iconv)的语义相混淆。对于源编码(来源..
或 -f) 必须指定文件的编码已保存(由创建它的程序执行)。而不是基于尝试(但失败)读取它的程序中的 mojibake 字符的一些(天真的)猜测。尝试使用 ISO-8859-15 或 WINDOWS-1252 来读取波斯语文本显然是一条死胡同:这些编码根本不包含任何波斯字母。
答案2
我发现可行的解决方案是使用微软 Visual Studio 代码文本编辑器是免费软件并且可用于 Linux。
在 VS-Code 中打开要转换编码的文件。窗口底部有几个按钮。其中一个与文件编码有关,如下所示:
单击此按钮会弹出一个包含两个项目的菜单。从此菜单中选择“使用编码重新打开”选项,如下所示:
这将打开另一个菜单,其中包含不同编码的列表,如下所示。现在选择“阿拉伯语(Windows 1256)”:
这将修复乱码文本,如下所示:
现在再次单击编码按钮,这次选择“使用编码保存”选项,如下所示:
并在新菜单中选择“UTF-8”选项:
这将使用 UTF-8 编码保存更正后的文件:
完毕! :)
答案3
除此之外iconv
,它本身就是一个非常有用的工具,或者在脚本中,我还发现了一个非常简单的解决方案,试图找出希腊字符集(Windows-1253 + ISO-8859-7)的相同问题。
您需要做的就是打开文本文件通过 Gedit 的“打开”对话框和不是双击它对话框底部有一个编码下拉菜单,设置为“自动检测”。将其更改为“Windows-125x”或其他合适的代码集,文本将在 Gedit 中完全可读。然后,您可以使用 UTF-8 编码保存它,以确保将来不会再遇到同样的问题...
答案4
iconv
作为该问题的补充解决方案,我根据以下命令准备了一个有用的 Bash 脚本Incnis Mrsi 的回答:
#!/bin/bash
if [ $# -lt 1 ]
then
echo 'Specify at least one file to fix.'
exit 1
fi
# Temp file to store conversion attempt(s).
tmp='tmp.fixed'
for file in "$@"
do
# Try to fix the file encoding.
if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
echo "Fixed: '$file'"
cat $tmp > "$file"
else
echo "Failed to fix: '$file'"
fi
done
rm $tmp
将此脚本保存为fix-encoding.sh
,使用 授予其执行权限chmod +x fix-encoding.sh
,然后像这样使用它:
./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub
此脚本将尝试修复作为输入提供的任意数量的文件的编码。请注意,文件将就地修复,因此内容将被覆盖。