【问题标题】:What's the best way to identify unicode encoded text files in Windows?在 Windows 中识别 unicode 编码文本文件的最佳方法是什么?
【发布时间】:2011-06-08 01:02:49
【问题描述】:

我正在开发一个代码库,由于多个团队成员使用不同的编辑器(和默认设置)进行开发,该代码库中散布着一些 unicode 编码文件。我想通过查找所有 unicode 编码文件并将它们转换回 ANSI 编码来清理我们的代码库。

任何关于如何完成这项任务的“发现”部分的想法都将不胜感激。

【问题讨论】:

  • 您使用什么编程语言?我想一个小的 VBS 脚本就足以完成这项任务。
  • 我们使用的是 c#,但我更多的是寻找一种可以用来搜索 unicode 编码文件的工具。您会在文本文件中查找什么来将它们识别为 unicode?​​span>

标签: windows search unicode


【解决方案1】:

Unicode 是一种标准,它不是一种编码。有许多实现 Unicode 的编码,包括 UTF-8、UTF-16、UCS-2 等。将这些编码中的任何一种转换为 ASCII 完全取决于您的“不同编辑器”使用什么编码。

一些编辑器在 Unicode 文件的开头插入 BOM 的字节顺序标记。如果您的编辑器这样做,您可以使用它们来检测编码。

ANSI 是一个标准机构,已发布了多种数字字符数据编码。 MS DOS 使用并在 Windows 中支持的“ANSI”编码实际上是 CP-1252,而不是 ANSI 标准。

您的代码库是否包含非 ASCII 字符?使用 Unicode 编码而不是 ANSI 编码或 CP-1252 可能会有更好的兼容性。

【讨论】:

  • 我们的代码库不包含任何非 ASCII 字符。我将尝试在我们的代码库中的文件中查找 BOM。感谢您的澄清。
  • 没有单一的 Windows 8 位(又名 ANSI)编码,有很多,例如 CP1251、CP1252、CP1253 等。另请参阅此问题:stackoverflow.com/questions/3864240/…
  • @HOCA,如果您的文件只包含 ASCII,则它已经是 UTF-8,不需要“转换”。
【解决方案2】:

这很难说,但我会从寻找 BOM 开始。大多数编写 Unicode 文件的 Windows 程序都会发出 BOM。

如果这些文件存在于您的代码库中,那么它们可能会编译。你可能会问自己是否真的需要做这个“整理”。如果您确实需要这样做,那么我会问处理这些文件的工具链如何发现它们的编码。如果您知道这一点,那么您将能够使用相同的诊断。

【讨论】:

  • 我们看到 google 闭包编译器会忽略以 UTF8 编码的 JS 文件,这就是“整理”的原因。我想 grep'ing for BOM 可能是这里最便宜的解决方案。
  • @HOCA Google 闭包编译器如何知道忽略一个文件,除非它有 BOM?我敢打赌,这些文件有 BOM,所以 grep 可以完成这项工作。
  • @HOCA 好吧,grep 会找到它们,但如果有很多,你可能想使用 Perl/Python/Ruby/whatever 脚本来实际转换它们。
【解决方案3】:

如果您正在寻找程序化解决方案,IsTextUnicode() 可能是一个选择。

【讨论】:

  • 它甚至不支持 UTF-8。
  • 虽然它并不完美,但 IsTextUnicode 正是记事本用来区分 Unicode 和 ANSI/UTF8 的。它在文件中查找 BOM 标头。做不到这一点,它有一些统计推断算法。但是您需要自己检测 ANSI 和 UTF8。
【解决方案4】:

“How to detect the character encoding of a text-file?”“How to reliably guess the encoding [...]?”

  • UTF-8 可以通过验证来检测。您也可以查找 BOM EF BB BF,但不要依赖它。
  • 可以通过查找 BOM 来检测 UTF-16。
  • UTF-32 可以通过验证或 BOM 来检测。
  • 否则采用 ANSI 代码页。

我们的代码库不包含任何 非 ASCII 字符。我会尝试 grep 用于我们代码库中文件的 BOM。 感谢您的澄清。

这让事情变得更简单了很多。没有非 ASCII 字符的 UTF-8 ASCII。

【讨论】:

  • 您所说的“可以通过验证检测到”是什么意思 - 您指的是哪种验证?谢谢!
  • 我的意思是检查数据是否仅由有效的 UTF-8 字节序列组成。例如,F0 9F 92 A9 是有效的 UTF-8,但 F5 9F 92 A9 不是。
【解决方案5】:

实际上,如果您想在 windows 中查找文件是否为 unicode,只需在文件上运行 findstr 以获取您知道的字符串。

findstr /I /C:"SomeKnownString" file.txt

它会空着回来。然后可以确定的是,对您知道文件中的字母或数字运行 findstr:

FindStr /I /C:"P" 文件.txt

你可能会遇到很多次,关键是它们会被隔开。这是文件是 unicode 而不是 ascii 的标志。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多