在C/C++中检测字符串的编码

jAc*_*OdE 6 windows character-encoding visual-c++

给定一个指向字节数组(chars)的字符串形式的字符串,如何在C/C++中检测字符串的编码(我使用的是visual studio 2008)?我进行了搜索,但大部分样本都是用C#完成的.

谢谢

MSN*_*MSN 8

假设您知道输入数组的长度,您可以进行以下猜测:

  1. 首先,检查前几个字节是否与Unicode的任何熟知的字节顺序标记(BOM)匹配.如果他们这样做,你就完成了!
  2. 接下来,在最后一个字节之前搜索'\ 0'.如果您找到一个,您可能正在处理UTF-16或UTF-32.如果你发现多个连续'\ 0',它可能是UTF-32.
  3. 如果任何字符是从0x800xff,它肯定不是ASCII或UTF-7.如果您将输入限制为某些Unicode变体,则可以假设它是UTF-8.否则,您必须进行一些猜测以确定它是哪个多字节字符集.这不会很有趣.
  4. 此时它是:ASCII,UTF-7,Base64或UTF-16或UTF-32的范围恰好不使用顶部位且没有任何空字符.


rus*_*_uk 5

这不是一个容易解决的问题,并且通常依靠启发式方法来对输入编码进行最佳猜测,这可能会被相对无害的输入所绊倒 - 例如,看看这篇维基百科文章记事本文件编码Redux以获得更多详细信息。

如果您正在寻找具有最小依赖性的仅限 Windows 的解决方案,您可以考虑使用IsTextUnicode和 MLang 的DetectInputCodePage的组合来尝试字符集检测。

如果您正在寻求可移植性,但不介意以 ICU 的形式承担相当大的依赖性,那么您可以利用它的字符集检测例程以可移植的方式实现相同的目标。