Unicode C库来检测文件是UTF 8还是UTF 16

Unicode C库来检测文件是UTF 8还是UTF 16,unicode,Unicode,是否有一个库可用于检查文件是UTF 8还是UTF 16?我发现了这一点,但它是在C++中的,由于种种原因,我不允许在我正在运行的软件中使用C++。感谢任何输入< /p> 你不需要一个库;您应该能够从文件的前几个字节进行猜测 如果文件开头有一个BOM(代码点U+feff),那么您可以使用它来嗅探编码,如下所示 00FE FF->UTF-32,大端 FF FE 00->UTF-32,小端 FE FF->UTF-16,大端 FF FE->UTF-16,小端 EF BB BF->UTF-8 从 如果

是否有一个库可用于检查文件是UTF 8还是UTF 16?我发现了这一点,但它是在C++中的,由于种种原因,我不允许在我正在运行的软件中使用C++。感谢任何输入< /p> 你不需要一个库;您应该能够从文件的前几个字节进行猜测

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

  • 00FE FF
    ->UTF-32,大端
  • FF FE 00
    ->UTF-32,小端
  • FE FF
    ->UTF-16,大端
  • FF FE
    ->UTF-16,小端
  • EF BB BF
    ->UTF-8

如果您知道或者可以合理地假设文件以ASCII开头,那么您可以通过查看前两个字节来区分UTF-8和UTF-16。如果文件以
UTF-32开头,则为big-endian
  • 3C00
    ->UTF-32,小端
  • 003C003F
    ->UTF-16,大端
  • 3C 00 3F 00
    ->UTF-16,小端
  • 3C 3F 78 6D
    ->UTF-8
  • 如果您不知道开头的文本,但知道它是ASCII,那么空字节的模式将是相同的

    如果文件不能可靠地以ASCII开头,那么它就开始变得复杂。但是

    不过,就通用性和可靠性而言,最好的方法可能是使用UTF Anwhere解码器开始解析文件,然后看看什么是有效的。事实上,既然这肯定是你无论如何都要做的事情,你不妨这样做,跳过嗅探文件的麻烦事

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


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

    字节顺序标记是可选的。你不能指望它是真实的,真实的:否决票当之无愧。我对答案进行了编辑以概括它。从技术上讲,该文件可能以非ASCII开头,这在某些情况下意味着区分UTF-16LE和BE可能很棘手。幸运的是,UTF-32和UTF-8很容易检测。事实上,在完全通用的情况下,检测编码的几乎唯一方法是通过在一个或其他编码中发现可能是错误的东西,例如UTF-16替代项(这也会指示偏好),或者UTF-8
    10xxxxxx
    octet在错误的位置。因此,正如建议的那样,最实用的建议可能是尝试解码,看看会发生什么。。。不是C++。它可以是什么语言?可能是Unicode的复制品吗?如果是这样,为什么不将编码也作为元数据/上下文?如果没有,还有很多其他的可能性。每个文件都是有效的CP437。BOM(UTF-32LE、UTF-32BE、UTF-16LE、UTF-16BE、UTF-8或UTF-7)是有效的Windows-1252。您为什么不知道数据文件的编码?