判断一个字符串是utf-8还是gb18030编码方法的最佳实践

这个问题之所以是一个问题,是因为有一些字符串是能够同时符合两种编码规范的,比如:

  • “跃” — 他的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);


  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值