转换文本文件编码


15

我经常遇到带有字符编码问题的文本文件(例如,使用我的母语波斯语的字幕文件)。这些文件是在Windows上创建的,并使用不合适的编码(似乎是ANSI)保存,看起来像乱码和不可读,如下所示:

在此处输入图片说明

在Windows中,可以使用Notepad ++轻松解决此问题,将编码转换为UTF-8,如下所示:

在此处输入图片说明

正确的可读结果是这样的:

在此处输入图片说明

我已经在GNU / Linux上搜索了很多类似的解决方案,但是不幸的是,建议的解决方案(例如,这个问题)不起作用。最重要的是,我见过人们的建议iconvrecode但是我对这些工具没有运气。我已经测试了许多命令,包括以下命令,但都失败了:

$ 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)。

“简单”的一个重要方面是不需要用户确定源编码。而是源编码应由工具自动检测,而目标编码应仅由用户提供。但是,尽管如此,我也很高兴知道需要提供源编码的可行解决方案。

如果有人需要测试用例来检查不同的解决方案,则可以通过此链接访问上面的示例。


2
试试:vim '+set fileencoding=utf-8' '+wq' file.txt
muru 2015年

波斯语应该是,iso-639但在iconv或中似乎都没有recode。至少,我在的输出中看不到它iconv -l
terdon 2015年

@muru我测试了您的建议,vim但没有成功。
Seyed Mohammad

@SeyedMohammad看起来还是一样吗?
muru 2015年

@muru是的!不用找了。
赛义德·穆罕默德

Answers:


12

这些带有波斯语文本的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)的语义混淆。对于源编码(source..或-f),必须指定一种用于保存文件的编码(由创建该文件的程序)。尝试(但失败)读取程序的程序中,基于mojibake字符的猜测很少(幼稚)。对于波斯语文本尝试使用ISO-8859-15或WINDOWS-1252显然是一种僵局:这些编码仅不包含任何波斯语字母。


@Seyed Mohammad:现在使用明确指定的命令。
Incnis Mrsi 2015年

谢谢!第二个命令(使用的命令iconv)起作用了。但是第一个(使用recode)无法正常工作,并且输出仍然乱码。编辑您的答案以仅包括iconv命令,我将其标记为答案。
赛义德·穆罕默德

1
另外,没有LANG变量设置,您可以做:iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txt我测试并工作了。因此,这样编辑命令可能是一个好主意。
赛义德·穆罕默德

我根据工作命令编写了一个有用的脚本,我在这里的另一个答案中对此做了解释。我希望它能对其他波斯语Linux用户有所帮助,因为它对我有很大帮助。
赛义德·穆罕默德

@karel:谢谢,“抱怨”是一个动词–该短语是不合语法的。
Incnis Mrsi 2015年

1

除了iconv,它本身或在脚本中都是非常有用的工具,我发现了一个非常简单的解决方案,试图找出希腊字符集(Windows-1253 + ISO-8859-7)的相同问题。

您需要做的就是通过Gedit的“打开”对话框打开文本文件不是双击文本文件。在对话框的底部,有一个用于编码的下拉菜单,它设置为“自动检测”。将其更改为“ Windows-125x”或其他合适的代码集,文本将在Gedit中完全可读。然后,您可以使用UTF-8编码保存它,以确保将来不会再次遇到相同的问题...


1

作为对该问题的补充解决方案,我根据Incnis Mrsi的回答中iconv命令准备了一个有用的Bash脚本:

#!/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

该脚本将尝试修复作为输入提供的任何数量的文件的编码。请注意,文件将被固定在原处,因此内容将被覆盖。


您无需将$ file放在  …  ”之外, 因为变量会在双引号和开放文本中展开。bash 仅会用美元符号按字面呈现“ $ file”
Incnis Mrsi 2015年

正如我在回答“ Incnis Mrsi”发布的答案时提到的那样,该解决方案无法正常工作,因此此脚本也是如此。
赛义德·穆罕默德

1

我不知道这是否适用于波斯语:我使用Gedit,它给出了错误的编码错误,我可以选择要翻译为UTF-8的内容,它只是文本未点亮的格式,但这是屏幕截图!

在此处输入图片说明

抱歉,我终于浏览了我的文本文件,所以现在它们都被转换了。

我也喜欢记事本++,仍然想念它。


Gedit无法解决问题。尽管Gedit不会为我的文件显示编码错误,但是即使它无法修复也是如此。我也尝试过在Gedit中使用UTF-8编码进行“另存为”,但是并不能解决问题。
赛义德·穆罕默德

1

如果您喜欢像我一样使用GUI而不是CLI进行工作:

  1. 与Geany打开文件(编辑)
  2. 转到文件菜单-> 重新加载为
  3. 选择假定的编码,以将乱码变成您语言中的可识别字符。例如,要阅读希腊潜艇,我将重新加载为西欧 -> 希腊语(Windows-1253)
  4. 转到文档菜单> 设置编码 -> Unicode- > UTF-8
  5. 保存

不起作用..
Aurimas

0

我找到的有效解决方案是使用Microsoft Visual Studio Code文本编辑器,该编辑器是免费软件,可用于Linux。

打开要在VS-Code中转换其编码的文件。在窗口底部,有一些按钮。其中之一与文件编码有关,如下所示:

在此处输入图片说明

单击此按钮会弹出一个包含两个项目的顶部菜单。从此菜单中选择“使用编码重新打开”选项,如下所示:

在此处输入图片说明

这将打开另一个菜单,其中包含不同编码的列表,如下所示。现在选择“阿拉伯语(Windows 1256)”:

在此处输入图片说明

这将修复像这样的乱码:

在此处输入图片说明

现在,再次单击编码按钮,这次选择“保存编码”选项,如下所示:

在此处输入图片说明

然后在新菜单中选择“ UTF-8”选项:

在此处输入图片说明

这将使用UTF-8编码保存更正的文件:

在此处输入图片说明

做完了! :)


尝试过“使用编码保存”,但它显示了以前的编码
agian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.