如何更正文件的字符编码?

时间:2020-03-06 14:42:41  来源:igfitidea点击:

我有一个ANSI编码的文本文件,不应该将其编码为ANSI,因为带有重音符号
ANSI不支持的字符。我宁愿使用UTF-8.

数据可以正确解码还是在转码中丢失?

我可以使用哪些工具?

这是我所拥有的样本:

?§ ??

我可以从上下文中得知(caf ??应该是caf),这些应该是这两个字符:

? é

解决方案

从命令行使用vim:

vim -c "set encoding=utf8" -c "set fileencoding=utf8" -c "wq" filename

使用iconv请参阅在字符集之间转换文本文件的最佳方法?

然后是较旧的重新编码程序。

如果我们在文件中看到问号,或者如果重音已经丢失,则返回utf8将无济于事。例如如果caf成为咖啡馆,则仅更改编码将无济于事(并且我们将需要原始数据)。

我们可以在此处粘贴一些文本,这我们确定答案。

有些程序尝试检测像chardet这样的文件的编码。然后,我们可以使用iconv将其转换为其他编码。但这要求原始文本仍然完整无缺,并且不丢失任何信息(例如,通过删除重音符号或者整个重音字母)。

当我们看到类似?的字符序列时和??,通常表示UTF-8文件已被以ANSI(或者类似格式)读取该文件的程序打开。 Unicode字符,例如:

U + 00C2带抑扬音的拉丁大写字母A
U + 00C3带波浪号的拉丁大写字母A
U + 0082允许在这里休息
U + 0083这里没有休息

由于UTF-8使用可变字节策略,因此倾向于以ANSI文本显示。这个策略在这里很好的解释了。

对我们来说,优点是这些奇数字符的出现使查找和替换错误转换实例变得相对容易。

我相信,由于ANSI始终每个字符使用1个字节,因此我们可以通过简单的搜索和替换操作来处理这种情况。或者更方便的是,使用一个程序,该程序包括在违规序列和所需字符之间的表映射,如下所示:

一种? ->应该是一个开双引号
一种? ->应该是双引号的结尾

假定使用英语,则任何给定的文本都将具有相对少量的不同类型的替换。

希望能有所帮助。

编辑:在进入更复杂的解决方案之前消除的一种简单可能性:我们是否尝试过在读取文件的文本编辑器中将字符集设置为utf8?这可能只是某人向我们发送要在设置为cp1252的编辑器中读取的utf8文件的情况。

仅以两个示例为例,这是通过单字节编码的镜头读取utf8的情况,可能是iso-8859-1,iso-8859-15或者cp1252中的一种。如果我们可以发布其他问题字符的示例,则应该可以将其范围进一步缩小。

由于视觉检查字符可能会产生误导,因此我们还需要查看底层字节:屏幕上看到的字节可能是0xa7或者0xc2a7,这将确定我们必须执行的字符集转换的类型。

我们是否可以假设所有数据都以完全相同的方式失真,即它们来自相同的来源并经过相同的转换顺序,例如,文本中没有单个数据,始终为?如果是这样,可以通过一系列字符集转换来解决该问题。如果我们可以更详细地了解所处的环境和所使用的数据库,则此处的某人可能会告诉我们如何执行适当的转换。

否则,如果问题字符仅出现在数据中的某些位置,则必须基于"没有作者打算在其文本中放置?的意思"这样的假设逐个实例化,因此只要我们看到它,替换为""。后一种选择的风险更大,首先是因为关于作者意图的那些假设可能是错误的,其次是因为我们必须亲自发现每个问题人物,如果有太多文字无法直观检查或者书写,则这是不可能的以我们不熟悉的语言或者写作系统。

我发现一种自动检测文件编码的简单方法,将文件更改为文本文件(在Mac上将文件扩展名重命名为.txt)并将其拖动到Mozilla Firefox窗口(或者"文件"->"打开")。 Firefox将检测到编码,我们可以在"查看"->"字符编码"下查看其编码。

我知道正确的编码后,便使用TextMate更改了文件的编码。文件->使用编码重新打开,然后选择编码。然后选择"文件"->"另存为",并将编码更改为UTF-8,并将行尾更改为LF(或者我们想要的任何格式)