unicode gbk utf8 utf16编码整理


  今天一个编码的问题纠结了我好久,京东商品详情页中的skuname是这样的:’\u934b\u56ec\ue56b\u701b\u612f\u2016\u741b\ue0a2\u30b3\u9427\u70ac\u60cc\u7441\u5474\u30b0\u741b\uff49\ue56b\u6d93\ue045\u0443\u76ac\u6966\u71b7\u57e1\u7f01\uff45\u4ea3\u68f0\u55d8\u58a6\u6434\u66de\u4ea3\u741b\uff49\ue56b\u9359\uff48\u59f3\u6748\u5f52\ue56b\u701b\u704f\u5fdb\u7b29\u9491\u53e5\u7b23\u9352\u8679\u552c’ 。我试图把他转换成正常字符串,但最后也没有成功。貌似是京东用gbk编码但是没办法解码解回去。。。在这里整理下各种编码的基本知识。


储存方式(unicode的实际字节存储)
unicode 是万国码,就是所有字都有固定对应的数字,最大4字节
unicode:UTF_32 一个字符占4个字节
unicode:UTF_16 2或4字节 在UTF16下,存储的字节值和unicode是一一对应的
unicode:UTF_8 可变长 1-4个字节 一个英文用ASCII来存,一个中文一般占3个字节


UTF16与UTF8
  在UTF16下,存储的字节值和unicode是一一对应的。但是UTF16显示英文(asni)就浪费一个字节。所以英文国家用UTF8的编码比较多。反之其他国家用UTF16的较多。比如 “你"在UTF8下3个字节的值是"0xE4/0xBD/0xA0”,但是在utf16下就只要 \u4f60就好了。


gbk 第一字节>127就当做汉字开始 2字节gbk 第一字节>127就当做汉字开始 2字节本来Unicode 只有2个字节,鉴于 Unicode 原有的16位元空间不足以应用,从 Unicode 3.1 版本开始,设立了16个辅助平面,使 Unicode 的可使用空间由六万多字增至约一百万字。 就是留一些码点区间作为辅助
就是说特殊字符用4字节来存

Unicode符号范围(十六进制) | UTF-8编码方式(二进制) 汉字一般3字节 1-4字节存

0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
————————————————
GBK
  而GBK用2字节描述中文,第一字节>127就当做汉字开始。 2字节比如汉字“路”,在gbk中的编码为“\xc2\xb7”,对应的二进制为:“1100 0010 1011 0111”。同时“路”在Unicode字符集中的位置是“\u8def”(python中的Unicode类型),因此可以通过“\u8def”在Unicode字符集中找到“路”对应的编码为“4237”,对应的二进制为:“0100 0010 0011 0111”,由于gbk的俩个字节的高字节是为了区分中文和ASCII,所以将“1100 0010 1011 0111”高字节的“1”去掉后,就对应Unicode字符集中的0100 0010 0011 0111”


  python2中的str实际上相当于byte类型,而unicode则存储的是unicode码。而python3中str默认就是unicode对象。
可以简单理解为:
python2 中的unicode -> python3 的str
python2 中的str-> python3 的byte

python3 unicode字符串按utf8编码为字节,这里可以看出一个汉字在utf8编码之后是3字节 而在编码之前是4个字节
>>> '测试'.encode('utf8')
b'\xe6\xb5\x8b\xe8\xaf\x95'

>>> '测试'.encode('unicode-escape')
b'\\u6d4b\\u8bd5'
>>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值