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

Encoding 如何更正文件的字符编码?,encoding,utf-8,character-encoding,text-files,codepages,Encoding,Utf 8,Character Encoding,Text Files,Codepages,我有一个ANSI编码的文本文件,它不应该像有重音符号那样被编码为ANSI ANSI不支持的字符。我更愿意与UTF-8合作 数据能被正确解码还是在转码过程中丢失 我可以使用什么工具 以下是我所拥有的一个样本: ç é 我可以从上下文(café应该是café)中看出,这应该是这两个字符: ç é 使用来自命令行的vim: vim -c "set encoding=utf8" -c "set fileencoding=utf8" -c "wq" filename 使用iconv-请参见,然

我有一个ANSI编码的文本文件,它不应该像有重音符号那样被编码为ANSI ANSI不支持的字符。我更愿意与UTF-8合作

数据能被正确解码还是在转码过程中丢失

我可以使用什么工具

以下是我所拥有的一个样本:

ç é
我可以从上下文(café应该是café)中看出,这应该是这两个字符:

ç é

使用来自命令行的vim:

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

使用iconv-请参见

,然后是稍旧的程序。

如果您在文件中看到问号,或者如果重音已经丢失,返回utf8将无助于您的原因。e、 如果咖啡馆变成了咖啡馆,仅仅改变编码是没有帮助的(而且你需要原始数据)


你能在这里粘贴一些文本吗,这将帮助我们确定答案。

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

当您看到字符序列,如ç和é时,通常表示UTF-8文件已被读取为ANSI(或类似文件)的程序打开。Unicode字符,例如:

U+00C2带扬抑符的拉丁文大写字母A
U+00C3拉丁文大写字母A随以波浪号
此处允许U+0082中断
U+0083此处无中断

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

这样做的好处是,这些奇怪字符的出现使得查找和替换错误转换的实例相对容易

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

“#应该是开头的双卷引号
-€?->“#应该是结束时的双卷引号

任何给定的文本,假设是英文的,都会有相对较少的不同类型的替换


希望这会有所帮助。

编辑:在进入更复杂的解决方案之前,一个简单的可能性可以消除:您是否尝试过在读取文件的文本编辑器中将字符集设置为utf8?这可能只是有人向您发送一个utf8文件,您正在一个编辑器中读取该文件,该编辑器设置为cp1252

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

由于对字符的目视检查可能会产生误导,您还需要查看底层字节:您在屏幕上看到的§可能是0xa7或0xc2a7,这将决定您必须执行的字符集转换类型

你能假设你所有的数据都是以完全相同的方式被扭曲的吗?它来自同一个来源,经历了相同的转换序列,例如,你的文本中没有一个é,它总是§?如果是这样,这个问题可以通过一系列字符集转换来解决。如果您可以更具体地了解所处的环境和所使用的数据库,这里的某人可能会告诉您如何执行适当的转换


否则,如果问题字符仅出现在数据中的某些地方,则必须根据“没有作者打算在文本中添加ç,因此无论何时看到它,都必须用Ã替换”的假设,逐个实例。后一种选择风险更大,首先是因为那些关于作者意图的假设可能是错误的,其次是因为你必须自己发现每个问题角色,如果有太多的文本无法目测,或者是用您不熟悉的语言或书写系统编写的,这可能是不可能的。

我找到了一种自动检测文件编码的简单方法-将文件更改为文本文件(在mac上,将文件扩展名重命名为.txt),然后将其拖到Mozilla Firefox窗口(或文件->打开)。Firefox将检测编码-您可以在View->Character encoding下看到它的结果

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

在OS X上,您可以用不同的编码显示文件的部分(ICU库支持所有这些编码)。一旦知道源编码是什么,您就可以通过剪贴板复制整个文件(字节),并插入到新文档中,其中选择了目标编码(UTF-8或任何您喜欢的编码)


使用UTF-8或其他Unicode表示法时非常有用的是

使用记事本执行以下步骤++

1-复制原文

2-在记事本++中,打开新文件,更改编码->选择您认为原始文本遵循的编码。请尝试使用“ANSI”编码,因为某些程序有时会将Unicode文件读取为ANSI

3-粘贴

4-然后通过再次浏览相同的菜单来转换为Unicode:Encoding->“Encode in UTF-8”(而不是“convert to UTF-8”),希望它能变得可读

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

大多数语言有两种编码形式:1-旧的遗留ANSI(如