判断一个字符串是utf-8还是gb18030编码方法的最佳实践
2014-10-24 17:23
323 查看
这个问题之所以是一个问题,是因为有一些字符串是能够同时符合两种编码规范的,比如:
“跃” — 他的GB18030编码为2字节 11010100 10111110,而同时也符合utf-8中的两字节的编码规范 110xxxxx 10xxxxxx,类似的汉字还有很多,比如:”珊”
“跃跃” — 他的utf-8编码为6字节 11101000 10110111 10000011 11101000 10110111 10000011,而同时这也是三个双字节的GB18030的编码(”璺冭穬”),虽然是一些生僻字
因此完全的识别字符串的编码不可能是一个完美(精确)的方案,但我们考虑到下面两个事实:
utf-8中使用2个字节编码的字符都是一些不常用的字符,通常一个文本中不会全部是这样的字符
如果把utf-8编码中超过3字节以上编码的内容按照gb18030的编码理解,得到的通常也是一些生僻字
我们在做一个假设
字符串要么符合utf-8编码规范,要么符合gb18030编码规范
就可以得到一个最佳实践:从头扫描一个字符串
如果不符合utf-8的规范,认为是gb18030编码
如果有符合utf-8规范中的3字节或4字节编码的,认为是utf-8编码
如果有符合utf-8规范中的2字节编码的,但是不符合gb18030编码的,认为是utf-8编码
如果全部都是符合2字节的utf-8编码,同时也符合gb18030编码的,认为是gb18030编码
我使用php实现了这个检查的函数,代码位于https://github.com/zhangchu/ko中的 Ko_Tool_Str::BIsUtf8($sIn);
“跃” — 他的GB18030编码为2字节 11010100 10111110,而同时也符合utf-8中的两字节的编码规范 110xxxxx 10xxxxxx,类似的汉字还有很多,比如:”珊”
“跃跃” — 他的utf-8编码为6字节 11101000 10110111 10000011 11101000 10110111 10000011,而同时这也是三个双字节的GB18030的编码(”璺冭穬”),虽然是一些生僻字
因此完全的识别字符串的编码不可能是一个完美(精确)的方案,但我们考虑到下面两个事实:
utf-8中使用2个字节编码的字符都是一些不常用的字符,通常一个文本中不会全部是这样的字符
如果把utf-8编码中超过3字节以上编码的内容按照gb18030的编码理解,得到的通常也是一些生僻字
我们在做一个假设
字符串要么符合utf-8编码规范,要么符合gb18030编码规范
就可以得到一个最佳实践:从头扫描一个字符串
如果不符合utf-8的规范,认为是gb18030编码
如果有符合utf-8规范中的3字节或4字节编码的,认为是utf-8编码
如果有符合utf-8规范中的2字节编码的,但是不符合gb18030编码的,认为是utf-8编码
如果全部都是符合2字节的utf-8编码,同时也符合gb18030编码的,认为是gb18030编码
我使用php实现了这个检查的函数,代码位于https://github.com/zhangchu/ko中的 Ko_Tool_Str::BIsUtf8($sIn);
相关文章推荐
- 判断输入的字符串是汉字,字母,还是数字?——经我实践最有效的方法
- 判断一个字符串编码是utf-8还是gbk
- 有什么最快的方法判断一个字符串内都是数字
- 判断是页面刷新还是关闭的一个方法
- 在php中判断一个请求是ajax请求还是普通请求的方法
- 判断一个字符串是否为数字的方法总结
- “设计一个方法判断字符串长度,一个汉字长度为1”?
- 如何判断一个网页是刷新还是关闭的方法。
- 在php中判断一个请求是ajax请求还是普通请求的方法
- Delphi判断一个字符是否为汉字的最佳方法[转]
- 判断一个字符串是否为数字的方法总结
- 判断一个字符串是否全是数字的多种方法及其性能比较(C#实现)
- Delphi判断一个字符是否为汉字的最佳方法
- 判断一个字符串是否全是数字的多种方法及其性能比较(C#实现)
- php中判断一个字符串包含另一个字符串的方法
- 判断一个字符是否为汉字的最佳方法[转]
- 判断一个字符是否为汉字的最佳方法 字数,字符,字节统计
- Linux 判断是否是一个目录还是一个文件的方法
- Linux 判断是否是一个目录还是一个文件的方法
- 判断一个数是否为对称数,不得使用转字符串的方法