Windows 7 UTF-8和Unicode


14

有人可以解释Windows 7(专业版64位)中发生的更改吗?

详细信息:以前我有Windows XP,并且有一些CSV格式的翻译文件(UTF-8编码)。我能够在记事本和Excel中查看字体。升级到Windows 7后,当我打开这些文件时,我看到的只是方框(您知道,如果在浏览器中打开它们,则可以看到所有翻译)。如果我将这些文件保存为Unicode,一切似乎都很好。

那么,到底发生了什么?为什么Windows 7使用Unicode而不使用UTF-8?

Answers:


30

为什么Windows 7使用Unicode而不使用UTF-8?

术语

UnicodeUTF-8并不是同一类东西:Unicode是一个字符集,它定义了一组字符(一个库)并为每个字符分配数字(代码点)。UTF-8是可用于表示磁盘上或传输中的Unicode字符流的几种编码之一。例如,相同的Unicode字符流也可以编码为UTF‑16,UTF‑32或UTF‑7。

但是,你“编码”选项,包括记事本提供ANSIUnicodeUnicode big-endianUTF-8。撰写此内容的Microsoft开发人员使用了错误的术语。当他们说“ Unicode”时,最有可能是“ UTF-16 little-endian ”。当他们说“ ANSI”时,它们表示代码页1252(CP-1252)。

微软记事本

我相信Microsoft的Notepad用字节顺序标记(BOM)编写UTF-16,并且该Notepad在读取文本文件时会查找BOM。BOM会告知应用程序该文件为UTF-16,并指示该文件是big-endian还是little-endian。

如果记事本找不到BOM表,则会调用一个库函数IsTextUnicode,该函数查看数据并尝试猜测使用了哪种编码。有时(不可避免)它猜错了。有时,它会猜测“ ANSI”文件是“ Unicode”。尝试将UTF-16或UTF-8文件解释为代码页1252将导致其显示错误的字形,并且无法找到可渲染某些8位值的字形-然后,这些字形将显示为正方形。

正如harrymc在回答中所说的,记事本有更好的选择。但是,记事本使您可以在打开文件时明确选择编码(而不是离开记事本进行猜测)。

字节顺序标记

根据Unicode联盟,字节顺序标记(BOM)是可选的。但是,Windows依靠BOM来区分某些编码。

简而言之,也许是由于某种原因您的文件缺少BOM?BOM可能在升级过程中的某个时间丢失了吗?

如果仍然有原始文件显示为正方形,则可以对其进行十六进制转储,以查看它们是否包含BOM。


纯文本文件标准

问题在于,实际上没有任何东西 –没有针对纯文本文件的通用标准。相反,我们有许多不兼容和未知数。

  • 线尾如何标记?一些平台使用控制字符回车(CR),然后使用换行(LF),一些平台仅使用CR,而某些则单独使用LF。

  • 以上是终止符还是分隔符?这在文件末尾起作用,并且已知会引起问题。

  • 选项卡和其他控制字符的处理。我们可能会假设使用制表符从行的开头对齐8个标准字符宽度的倍数,但实际上并不确定。许多程序允许更改制表符位置。

  • 字符集和编码?没有通用标准来指示文件中的哪些已用于文本中。最接近的是寻找BOM的存在,该BOM指示编码是用于Unicode的编码之一。从BOM值中,读取文件的程序可以区分UTF-8和UTF-16等,以及UTF-16的Little-Endian和Big-Endian变体,等等。没有通用的标准来指示文件以其他任何流行的编码方式(例如CP-1252或KOI-8)进行编码。

等等。以上元数据均未写入文本文件-因此,最终用户在读取文件时必须通知程序。最终用户必须知道任何特定文件的元数据值,否则冒着其程序将使用错误的元数据值的风险。

布什掩盖事实

在Windows XP上尝试此操作。

  • 打开记事本。
  • 将字体设置为Arial Unicode MS。(您可能需要先安装它;如果在菜单中没有看到它,请单击“显示更多字体”。)
  • 输入文本“布什隐藏事实”。
  • 选择Save As。从Encoding菜单中选择ANSI
  • 关闭记事本。
  • 重新打开文档(例如,使用StartMy Recent Documents)。
  • 您将看到畂桳栠摩琠敨映捡獴而不是“ Bush隐藏事实”。

这说明IsTextUnicode记事本使用的功能错误地猜测ANSI(真正的代码页1252)文本是不带BOM的Unicode UTF-16LE。另存为的文件中没有BOM ANSI

Windows 7的

对于Windows 7,Microsoft进行了调整IsTextUnicode,以使上述情况不会发生。在没有BOM的情况下,现在比Unicode(UTF-16LE)更可能猜测ANSI(CP 1252)。使用Windows-7我希望,因此你可能有相反的问题:包含Unicode字符的代码点大于255的文件,但没有BOM,现在更容易被猜测为ANSI -因此显示不正确。

防止编码问题

当前,最好的方法似乎是在各处使用UTF-8。理想情况下,您将所有旧文本文件重新编码为UTF-8,并且仅将文本文件另存为UTF-8。有一些工具,例如recodeiconv可以帮助解决这个问题。


3
根据Wikipedia的说法:在Windows Vista和Windows 7中,[..] IsTextUnicode已更改,以使其更有可能猜测基于字节的编码,而不是UTF-16LE。
Arjan 2010年

是的,由于我们使用BOM生成这些文件,因此可以肯定这些文件具有BOM。有趣的是,Windows 7不会读取由旧版操作系统创建的BOM。
沙勒2010年

BOM表未更改。可能是您的文件缺少BOM表,但以前的默认格式是某些Unicode变体,现在是ASCII。看我的答案。
harrymc

@Sha Le:如果文件具有BOM表,则Windows 7记事本应正确打开它,因此您描述的问题不适合的已知问题isTextUnicode。您能否创建一个小的示例文件来说明包含BOM的文件存在的问题?
RedGrittyBrick 2010年

也有this app can break对同样的效果Bush hid the facts
丽晶

3

备注:您可以使用“ 记事本” ++,通过“编码”菜单查看这些文件。

文件正确显示后,保存它们将添加正确的BOM。


我知道这篇文章有点老,但是当我最初使用notepad ++ v5.9.6.2本身创建文件时,win 7和notepad ++当前不存在没有BOM的UTF 8的问题。
杰克

@Jake:确保“编码”菜单显示“在UTF8中编码”,而不是“在没有BOM的UTF8中编码”。
harrymc

1

在Windows 10中是可能的(在1903年版本上测试)

  1. 将具有良好编码的文件复制TXTUTF-8.txtC:\WINDOWS\SHELLNEW
  2. HKEY_CLASSES_ROOT\.txt\ShellNew创建名称为“ FileName” 的新链条时
  3. 将“ FileName” 的值更改为“ TXTUTF-8.txt

现在,当您使用Windows菜单制作新的txt文件时,它将以您TXTUTF-8.txt的模板为模板

来源:https : //answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

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.