工作中用到了很多次字符集转换问题,最近遇到的一次字符集问题在此做一个记录和推理过程.

1. 遇到的现象

在使用protobuf时候utf-8字符集时候 总会有 \u0f23 \u1a4a 这样的字符出现? 同理在使用python爬虫获取内容的时候中文被显示成 \u0f23 \u1a4a?

字符示例

"name": "保证金收益货币市场基金",
"name-UTF8toUNICODE": "\u4fdd\u8bc1\u91d1\u6536\u76ca\u8d27\u5e01\u5e02\u573a\u57fa\u91d1",

1.1 疑问:

  1. 这是什么字符集?
  2. 为什么用二进制表示?
  3. ‘\u’表示什么?“unicode”还是“GBK”?

2.猜测推理

2.1 猜想:

我先猜测是gbk, 但是不论是转后报错 再猜测是unicode转译后仍然报错(因为我要用 string去表示wstring) unicode通常和wstring绑定的. 那这串文字到底是什么呢?

答案: "\u4fdd\u8bc1\u91d1\u6536\u76ca\u8d27\u5e01\u5e02\u573a\u57fa\u91d1"被转译成byte的unicode字符集

2.2 验证:

通过一个在线字符工具做的转换 “name-UTF8toUNICODE”: “\u4fdd\u8bc1\u91d1\u6536\u76ca\u8d27\u5e01\u5e02\u573a\u57fa\u91d1”, 转换成可见的中文,用此方式找到该字符的字符集 工具什么不重要,我也不会列举工具的网站,方法是有效的,执行是灵活的.

我得到了答案 是该字符串是Unicode-16字符集. 该字符集特点是asic 是1个字符,汉字是2个字符,并且带有 ‘\u’ (作为开头), 其实也就是我们常见的宽字节类型.

2.3 补充说明

unicode 通常使用wstring存储 2字节表示一个字符 好处就是容量够大 够全世界到文字存储

二进制表示字符集的意义 所以在我们测试protobuf时候会有一些转译成byte类型的中文被显示出来 这样的好处就是没有乱码 同样在使用python去表示一些字符的时候由于python不想破坏原有字符集 ,做了个模糊处理,所有字符都按照二进制输出 这样确实可以做好一些兼容的问题.

3.总结

3.1字符集合

ASCII (127个字母) :所有字符占用一个字节 UTF-8 : unicode的缩减版本,涵盖常用文字(各个国家文字) ,英文一个字节,中文三个字节(常用中文字符用utf-8编码占用3个字节(大约2万多字) GBK2312(常用中文) :中文占用两个字节 ,英文(半角)一个字节 GBK(涵盖非常用中文) : 中文占用两个字节,英文(半角)一个字节 unicode(各个国家文字) : ***所有字符占用两个字节***

ps: 但超大字符集中的更大多数汉字要占4个字节(在unicode编码体系中,U+20000开始有5万多汉字)。 GBK、GB2312收编的汉字占2个字节,严格地用iso8859-1无法表示汉字,只能转为问号。