如何更正文件的字符编码?
Posted
技术标签:
【中文标题】如何更正文件的字符编码?【英文标题】:How do I correct the character encoding of a file? 【发布时间】:2010-09-13 00:53:50 【问题描述】:我有一个 ANSI 编码的文本文件,它不应该被编码为 ANSI,因为有重音符号 ANSI 不支持的字符。我宁愿使用 UTF-8。
数据能正确解码还是在转码中丢失?
我可以使用哪些工具?
这是我所拥有的示例:
ç é
我可以从上下文中看出(café 应该是 cafe)这应该是这两个字符:
ç é
【问题讨论】:
你知道文件的原始编码吗(假设它在某个时候从一个字符集转换为另一个字符集)?如果是这样,您应该能够使用this one 之类的表将结果字符映射回原始字符。如果您不知道原始编码,您可能会根据您正在使用的语言中不同单词的频率使用概率方法来计算它。但您可能不愿意投入所需的工作。 很遗憾,我不知道原始编码。当客户向您发送在各种系统上制作的文件时,这是一个常见问题。他们可能不知道字符编码是什么。请注意,默认情况下使用 UTF-8 的 Linux 桌面越来越多地采用可以透明地减少此问题。 我完全同意。 UTF-8 绝对是在大多数情况下使用的最合理的编码,但不幸的是,您很难期望客户能够理解或采取行动。 【参考方案1】:使用 Notepad++ 执行这些步骤
1-复制原文
2- 在 Notepad++ 中,打开新文件,更改编码 -> 选择您认为原始文本遵循的编码。尝试编码“ANSI”,因为有时某些程序会将 Unicode 文件读取为 ANSI
3- 粘贴
4- 然后通过相同的菜单再次转换为 Unicode:编码 ->“在 UTF-8 中编码”(不是“转换为 UTF-8”),希望它会变得可读
上述步骤适用于大多数语言。您只需要在粘贴到 notepad++ 之前猜测原始编码,然后通过相同的菜单转换为基于 Unicode 的替代编码,以查看内容是否变得可读。
大多数语言以 2 种编码形式存在: 1- 旧的 ANSI (ASCII) 形式,只有 8 位,最初被大多数计算机使用。 8 位仅允许 256 种可能性,其中 128 位是常规拉丁字符和控制字符,最后 128 位的读取方式因 PC 语言设置而异 2- 新的 Unicode 标准(最多 32 位)为每个字符提供唯一代码在所有当前已知的语言中,还有更多。如果文件是 unicode,则应该在任何安装了该语言字体的 PC 上都能理解。请注意,即使 UTF-8 上升到 32 位,并且与 UTF-16 和 UTF-32 一样广泛,它也尝试将拉丁字符保持在 8 位,以节省磁盘空间
【讨论】:
感谢 broda,您的回答使我摆脱了 .sql 文件编码的 2 天问题。有用。在 Mac 上拧 Sublime 文本! 你是个天才 我不得不使用 paste speciel - "paste binary data" 在记事本++中,如果您只是打开原始文件,请转到编码菜单并查看选择了什么。它还有一个转换为,因此您可以查看它是否与字符集匹配。我知道这是一个老问题。【参考方案2】:编辑:在进入更复杂的解决方案之前消除一种简单的可能性:您是否尝试在正在读取文件的文本编辑器中将字符集设置为 utf8?这可能只是有人向您发送您在设置为 cp1252 的编辑器中阅读的 utf8 文件的情况。
仅举两个例子,这是一个通过单字节编码的镜头读取 utf8 的情况,可能是 iso-8859-1、iso-8859-15 或 cp1252 之一。如果您可以发布其他问题角色的示例,则应该可以进一步缩小范围。
由于对字符的目视检查可能会产生误导,因此您还需要查看底层字节:您在屏幕上看到的 § 可能是 0xa7 或 0xc2a7,这将决定您拥有的字符集转换类型去做。
您能否假设您的所有数据都以完全相同的方式被扭曲 - 它来自同一个来源并经历了相同的转换序列,例如,您的文本中没有一个 é , 它总是 ç?如果是这样,可以通过一系列字符集转换来解决问题。如果您可以更具体地了解您所处的环境和您正在使用的数据库,这里的某人可能会告诉您如何执行适当的转换。
否则,如果问题字符仅出现在数据中的某些位置,您将不得不根据“没有作者打算在其文本中添加 ç,因此每当你看到它,用ç”替换。后一种选择风险更大,首先是因为那些关于作者意图的假设可能是错误的,其次是因为你必须自己发现每个问题字符,如果有太多文本需要目视检查或者如果它是书面的,这可能是不可能的使用您不熟悉的语言或书写系统。
【讨论】:
很多选项,取决于你在哪里:hd -c 文件名,在 vi 中打开并查看“奇怪”字符转义,php 中的 bin2hex,mysql 中的 hex(fieldname)。跨度> 谢谢,这似乎是最好的解决方案。了解底层字节并智能替换它们似乎是最聪明的选择,开发一个脚本来自动化更改。【参考方案3】:当您看到 ç 和 é 之类的字符序列时,通常表明 UTF-8 文件已被以 ANSI(或类似格式)读取的程序打开。 Unicode 字符,例如:
U+00C2 带抑扬符的拉丁文大写字母 A U+00C3 带波浪号的拉丁文大写字母 A U+0082 此处允许中断 U+0083 此处不中断
由于 UTF-8 使用的可变字节策略,倾向于显示在 ANSI 文本中。这个策略解释得很好here。
对您来说的好处是这些奇怪字符的出现使查找和替换不正确转换的实例相对容易。
我相信,由于 ANSI 始终使用每个字符 1 个字节,您可以通过简单的搜索和替换操作来处理这种情况。或者更方便的是,使用包含违规序列和所需字符之间的表映射的程序,如下所示:
——->“# 应该是一个双引号 ? -> ” # 应该是双引号
任何给定的文本,假设它是英文的,都会有相对少量的不同类型的替换。
希望对您有所帮助。
【讨论】:
【参考方案4】:从命令行使用 vim:
vim -c "set encoding=utf8" -c "set fileencoding=utf8" -c "wq" filename
【讨论】:
【参考方案5】:使用 iconv - 请参阅 Best way to convert text files between character sets?
【讨论】:
一个简单的转换会假设数据是正确的并保留坏数据吗? 是的,它会的。我认为人们误解了这个问题。问题是数据已经损坏,因此您需要一个补救解决方案。【参考方案6】:在 sublime 文本编辑器中,文件 -> 使用编码重新打开 -> 选择正确的编码。
一般会自动检测编码,如果没有,可以使用上面的方法。
【讨论】:
【参考方案7】:如果您在文件中看到问号或重音符号已经丢失,则返回 utf8 将无助于您的事业。例如如果咖啡厅变成咖啡厅 - 仅更改编码将无济于事(您需要原始数据)。
您能在此处粘贴一些文字,这将有助于我们确定答案。
【讨论】:
【参考方案8】:我找到了一种自动检测文件编码的简单方法 - 将文件更改为文本文件(在 Mac 上将文件扩展名重命名为 .txt)并将其拖到 Mozilla Firefox 窗口(或文件 -> 打开)。 Firefox 将检测编码 - 您可以在 View -> Character Encoding 下查看它的结果。
一旦我知道正确的编码,我就使用 TextMate 更改了文件的编码。文件 -> 使用编码重新打开并选择您的编码。然后 File -> Save As 并将编码更改为 UTF-8 并将行尾更改为 LF(或任何您想要的)
【讨论】:
【参考方案9】:我在寻找中文字符的代码页问题的解决方案时发现了这个问题,但最终我的问题只是 Windows 无法在 UI 中正确显示它们的问题。
如果其他人有同样的问题,您只需将 windows 中的本地更改为中国,然后再返回即可解决。
我在这里找到了解决方案:
http://answers.microsoft.com/en-us/windows/forum/windows_7-desktop/how-can-i-get-chinesejapanese-characters-to/fdb1f1da-b868-40d1-a4a4-7acadff4aafa?page=2&auth=1
还赞成 Gabriel 的回答,因为在 notepad++ 中查看数据是让我了解 Windows 的原因。
【讨论】:
【参考方案10】:然后是稍旧的recode 程序。
【讨论】:
【参考方案11】:有些程序会尝试检测像chardet 这样的文件的编码。然后您可以使用 iconv 将其转换为不同的编码。但这要求原始文本仍然完好无损,并且不会丢失任何信息(例如通过删除重音符号或整个重音字母)。
【讨论】:
【参考方案12】:在 OS X 上,Synalyze It! 允许您以不同的编码显示文件的某些部分(ICU 库支持所有这些编码)。一旦您知道源编码是什么,您就可以通过剪贴板复制整个文件(字节)并插入到选择目标编码(UTF-8 或任何您喜欢的)的新文档中。
在使用 UTF-8 或其他 Unicode 表示时非常有用的是UnicodeChecker
【讨论】:
以上是关于如何更正文件的字符编码?的主要内容,如果未能解决你的问题,请参考以下文章