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

12

给定一个以指向字节数组(字符)的指针形式表示的字符串,如何在C/C++中检测字符串的编码(我使用的是Visual Studio 2008)?我搜索了一下,但大多数示例都是用C#完成的。

谢谢


你期望有哪些可能的编码方式?是只有一小部分可能的编码方式,还是任何编码方式都有可能呢? - Kerrek SB
你使用的是什么开发环境?我认为在Linux下有一个库可以做到这一点,并且可以移植到Windows。 - Albert Perrien
1
谢谢大家, K-ballo,Kerrek:可能是UTF8、UCS2/UTF16或ANSI; AlbertPerrien:顺便说一下,我正在使用Windows,那么这个库的名字是什么? - jAckOdE
3个回答

11
假设您知道输入数组的长度,您可以进行以下猜测:
  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的范围,它们刚好没有使用顶部位并且没有任何空字符。

5
这不是一个容易解决的问题,通常需要启发式方法来猜测输入编码,但相对无害的输入可能会使其失效 - 例如,请查看此维基百科文章Notepad文件编码Redux以获取更多详细信息。
如果你正在寻找一个仅适用于Windows且依赖性最小的解决方案,可以考虑使用IsTextUnicode和MLang的DetectInputCodePage组合尝试进行字符集检测。
如果您想要便携性,但不介意采用ICU这种相当大的依赖项,则可以利用其字符集检测例程以便携方式实现相同的功能。

2
我已经编写了一个小型的C++库,用于检测文本文件的编码。它使用Qt进行操作,但同样可以仅使用标准库轻松实现。
它通过测量符号出现统计数据,并将其与不同编码和语言中预先计算的参考值进行比较来运作。因此,它不仅可以检测编码,还可以检测文本的语言。缺点是必须为目标语言提供预先计算的统计数据才能正确检测该语言。 https://github.com/VioletGiraffe/text-encoding-detector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接