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

问题描述:

我有一个ANSI编码的文本文件,不应该被编码为ANSI,因为那里有ANSI不支持的重音 字符。我宁愿使用UTF-8。如何更正文件的字符编码?

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

我可以使用哪些工具?

这里是什么,我有一个样本:

ç é 

我可以从上下文告诉(*美术学院©应该是咖啡厅),这些应该是这两个字:

ç é 
+0

您是否知道文件的原始编码(假设它在某个点从一个字符集转换到另一个字符集)?如果是这样,您应该能够通过使用像[这一个](http://www.alanwood.net/demos/charsetdiffs.html)这样的表格将结果字符映射回原始字符。如果您不知道原始编码,则可以使用概率方法,根据您使用的语言中不同单词的频率进行编码。但是你可能不愿意投入需要的工作。 – gregory 2008-09-25 09:39:08

+0

不幸的是,不,我不知道原始编码。当客户向您发送在各种系统上制作的文件时,这是一个常见问题。他们可能不知道字符编码是什么。请注意,默认情况下越来越多地采用使用UTF-8的Linux桌面可以透明地解决这个问题。 – Liam 2008-09-25 09:52:35

+0

我完全同意。不幸的是,UTF-8绝对是大多数情况下使用的最合理的编码方式,但很难期望客户理解或采取行动。 – gregory 2008-09-25 12:27:17

编辑:在进入更复杂的解决方案之前消除一个简单的可能性:你有没有尝试在你正在阅读文件的文本编辑器中将字符集设置为utf8?这可能就是某个人向你发送了一个utf8文件的例子,你正在编辑器中读取cp1252。

只是举了两个例子,这是一个通过单字节编码的镜头读取utf8的情况,可能是iso-8859-1,iso-8859-15或cp1252之一。如果您可以发布其他问题角色的示例,则应该可以缩小范围。

由于对字符的视觉检查可能会引起误解,您还需要查看基础字节:您在屏幕上看到的§可能是0xa7或0xc2a7,并且这将决定您的字符集转换类型得做。

您能否假设您的所有数据都以完全相同的方式发生了扭曲 - 它来自同一个来源并经历了相同的转换序列,因此例如您的应用程序中没有一个文字,它总是?如果是这样,问题可以通过一系列字符集转换来解决。如果您可以更具体地了解您所使用的环境和您正在使用的数据库,此处有人可能会告诉您如何执行适当的转换。否则,如果问题字符只出现在数据中的某些位置,则必须根据假设沿着“没有作者打算在其文本中放置ç”的假设,所以只要你看到它,用ç“替换。后一种选择风险更大,首先是因为那些关于作者意图的假设可能是错误的,其次是因为你必须自己发现每一个问题特征,如果有太多的文本要进行视觉检查或者如果它被写入,这可能是不可能的用一种对你来说是陌生的语言或写作系统。

用vim从命令行:

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

+0

简单的转换是否会假定数据是正确的并保留不良数据? – Liam 2008-09-25 10:05:43

然后有一些比较老的recode程序。

如果您在文件中看到问号或者口音已经丢失,返回到utf8将无助于您的原因。例如如果咖啡馆变成了咖啡馆 - 单独改变编码将无济于事(你需要原始数据)。

你可以在这里粘贴一些文字,这将帮助我们肯定地回答。

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

当你看到像§和A©字符序列,它通常是一个UTF-8的文件已被一个程序,读取它的ANSI(或类似)打开的指示。 Unicode字符,如这些:

U + 00C2拉丁大写字母与回旋
U + 00C3拉丁大写字母与波浪A A
U + 0082歇允许在这里
U + 0083这里没有休息

往往会在ANSI文字显示,因为变量字节的战略,UTF-8使用的了。这个策略很好地解释here

您的优势是,这些奇怪字符的出现使得查找和替换不正确转换的实例变得相对容易。

我相信,由于ANSI总是使用每个字符1个字节,所以您可以通过简单的搜索和替换操作来处理这种情况。或者更方便的是,使用包含有问题的序列和所需字符之间的表格映射的程序,如下所示:

“ - >”#应该是双曲开盘报价
“ - >“#应该是一个结束双曲线报价

任何给定的文本,假设它是英文的,将有相对少量的不同类型的替换。

希望有所帮助。

我发现了一种简单的方法来自动检测文件编码 - 将文件更改为文本文件(在Mac上将文件扩展名重命名为.txt)并将其拖到Mozilla Firefox窗口(或文件 - >打开) 。 Firefox将检测编码 - 您可以在View - > Character Encoding下看到它的内容。

一旦我知道了正确的编码,就使用TextMate更改了文件的编码。文件 - >使用编码重新打开并选择您的编码。然后将文件 - >另存为,然后将编码更改为UTF-8和行结尾为LF(或任何你想要的)

在OS X上Synalyze It!可以让你以不同的编码显示你的文件的各个部分ICU图书馆)。一旦你知道什么是源编码,你可以通过剪贴板复制整个文件(字节),并插入到一个新的文档中,目标编码(UTF-8或任何你喜欢的)被选中。

使用UTF-8或其他的Unicode表示工作时非常有帮助的是UnicodeChecker

按照以下步骤用记事本++

1复制原文

2。在记事本++,打开新的文件,改变编码 - >选择你认为原始文本如下的编码。尝试以及编码“ANSI”因为有时Unicode文件是由某些程序

3-粘贴

4-然后通过在同一菜单中再次将转换为Unicode改为ANSI:编码 - >“编码UTF-8“(不是”转换为UTF-8“),并希望它变得可读

以上步骤适用于大多数语言。在粘贴记事本++之前,您只需要猜测原始编码,然后通过相同的菜单转换为另一种基于Unicode的编码,以查看事物是否可读。

大多数语言都以两种编码形式存在:1-大多数计算机最初使用旧的传统ANSI(ASCII)格式,只有8位。 8位仅允许256种可能性,其中128种常用拉丁字符和控制字符,最后128位根据PC语言设置的不同而被读取。2新的Unicode标准(最多32位)为每个字符提供唯一的代码在所有当前已知的语言中,还有很多更多。如果文件是unicode,则应在任何安装了该语言字体的PC上理解。请注意,即使UTF-8上升到32位,只是与UTF-16和UTF-32一样宽泛,只是它试图保留8位拉丁字符只是为了节省磁盘空间

我在搜索时发现此问题对于我用中文字符代码页问题的解决方案,但最终,我的问题只是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

也upvoted加布里埃尔的答案寻找在记事本中的数据++是什么放倒我了约窗口。

在崇高的文本编辑器中,文件 - >重新打开编码 - >选择正确的编码。

一般情况下,编码是自动检测的,但如果没有,您可以使用上述方法。