在C / C ++中检测string的编码

给定一个指向字节数组(char)的指针forms的string,如何检测C / C ++中的string编码(我用过visual studio 2008)? 我做了一个search,但大多数样本是在C#中完成的。

谢谢

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

  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的范围,它们恰好不使用最高位,也没有任何空字符。

这不是一个容易解决的问题,而且通常依赖于启发式方法来最好地猜测输入的编码是什么,这可以通过相对无害的输入来绊倒 – 例如,看看这篇维基百科文章和记事本文件编码Redux的更多细节。

如果您正在寻找只依赖最少的Windows解决方案,则可以使用IsTextUnicode和MLang的DetectInputCodePage组合来查看字符集检测。

如果你正在寻找便携性,但不介意以ICU的形式承担相当大的依赖,那么你可以利用它的字符集检测例程来以便携的方式实现相同的事情。