用于检测文件是否为UTF 8或UTF 16的C库

时间:2014-07-29 16:12:40

标签: unicode

是否有可用于检查文件是UTF 8还是UTF 16的库?我发现这个http://utfcpp.sourceforge.net/但它是用C ++编写的,由于各种原因,我不允许在我正在工作的软件中使用C ++。感谢任何输入

1 个答案:

答案 0 :(得分:1)

你不需要图书馆;你应该能够从文件的前几个字节做出猜测。

如果文件开头有BOM(代码点U + feff),那么您可以使用它来嗅探编码,如下所示。

  • 00 00 FE FF - > UTF-32,big-endian
  • FF FE 00 00 - > UTF-32,little-endian
  • FE FF - > UTF-16,big-endian
  • FF FE - > UTF-16,little-endian
  • EF BB BF - > UTF-8

来自the Unicode FAQ

如果你知道,或者可以合理地假设文件以ASCII开头,那么你可以通过查看前几个字节来区分UTF-8和UTF-16。如果文件以<?xml...开头(例如!),那么:

  • 00 00 00 3C - &gt; UTF-32,big endian
  • 3C 00 00 00 - &gt; UTF-32,小端
  • 00 3C 00 3F - &gt; UTF-16,big endian
  • 3C 00 3F 00 - &gt; UTF-16,小端
  • 3C 3F 78 6D - &gt; UTF-8

如果您不知道开头的文本,但确实知道它是ASCII,那么空字节的模式将是相同的。

如果文件无法以ASCII方式可靠启动,则会开始复杂化。但...

但是,就通用性和可靠性而言,最好的方法可能是开始使用UTF解析文件 - 无论解码器是什么,看看哪些有效。事实上,既然这肯定是你要做的事情,你也可以这样做,并且跳过嗅到文件的混乱业务。

(这肯定是重复的,但我找不到与它完全匹配的问题)

已编辑,请注意文件不一定以BOM表开头,但在某些情况下仍然可以嗅探。