如果给定一个文本/字符串,要获得其编码方式,除了BOM位判断法(很多文件没有BOM标志,有也不一定就正确),就只能通过猜测的方式来获得了。
不管是Linux下的iconv或者windows下的编码转换API都可以知道转换失败的。所以可以随便截一段话,不知道是utf-16,utf-8,gbk没关系,就假设它是,然后转换到另一种编码,如果成功转换了,可能就是它了,如果失败, 那就可能不对。当然如果截取的部分比较小或者不具代表性(比如截到“12345”,哪知道是utf8还是gbk),可能多种编码都能通过检验。如果文本不 是很规范,也可能全都失败。
如果不考虑计算代价的话,可以把整个文本抓去转换,转换中错误最小的编码就可以认为是该文本的编码了。如果觉得体位还可以再复杂些,可以加入统计语言模型。如果文本内容是有意义的,长度超过10个字,我相信正确率可以超过99.9%,但如果太短就不太好说了。
另外江湖传言IBM有个开源项目:ICU,这里面有猜测编码的API。
======================================================================
后记,有不明真相的围观群众建议从前往后用语言模型进行判断,直到某种编码明显胜出。这样做应该准确率高而且速度也很快。如果只用一维的语言模型(估计够用),体积也很小,只有几百k。