谈谈Python编码问题和Unicode.ppt
谈谈Python编码问题和Unicode,taochunhuatencent,outline,Unicode基础知识Python的str和unicodeJson编码工具实例,Unicode,Ascii时代7位,最高位是校验位MBCS时代(多字节字符集)中文CP963,GBK,GB2312,BIG5UnicodeUnicode16,Unicode32,题外话:存在与表示,Big Endian&Little EndianSPARK,x86,ARMHost Byte Order&Network Byte Orderhtonl,ntohl,htons,ntohsObject Persistence&SerializeMFC,java serialiable interface and persistence api,protobufUnicode&UTF,UCSSeveral mechanisms have been specified for implementing Unicode.,unicode&utf,unicodeunicode16,unicode32 Unicode Transformation Format(UTF)UTF16(Big/Little Endian)UTF32(Big/Little Endian)UTF8变长方案思考?为什么是变长的?如何实现?,Python str&unicode,str对象存储ascii字符串,以及二进制数据unicode对象存储unicode字符串,采用的是utf16或utf32str用来存储各种utf数据,包括gbk等可以认为:unicode对象是理想的unicode,str是丑陋的现实(各种utf),str与unicode的转化,使用时机,拇指定律IO时用work,file read write内部处理时用unicodejson encode,string process例子从外部读入时它是str转为unicode进行必要处理再转为str输出,demo,体验demo.py,import json,我懂了上面说的,为什么json还是搞不定?嗯,因为json帮你encode,decode了一些东西需要仔细阅读json模块的文档,json.dumps(obj,ensure_ascii,encoding.)obj python数据结构:dic,list.ensure_ascii=True(default)dumps返回一个strensure_ascii=Falsedumps返回一个unicode!我们可以进一步对它encodeencoding在obj进行转化之前,所有obj中的str会转为unicode,即str.decode(encoding)默认情况:str-unicode-json(unicode)-str,一个默认处理,json.dumps(d,encoding=gbk)它返回一个strstr-unicode-json(unicode)-strstr-unicode的decode在 encoding参数控制json(unicode)-str 这里的encoding是默认控制的!这个默认控制不是encode,而是直接把unicode转义为ascii编码,这个ascii码的内容是unicode!这里应该是个utf8,这个过程是个硬编码:见lib中encode.py,证据,老白干酒utf8:0 x8001 0 x767D 0 x5E72 0 x9152gbk:0 xC0CF 0 xB0D7 0 xB8C9 0 xBEC6,JSON本身的规范和实现,有了以上知识,我们还有可能搞不定特定需求:比如,请给我弄个GKB的字符串!JSON规范定义string必须是unicode字符串,但是实现形式默认是utf8有些json解析函数仅实现了utf8,不支持其他格式!,实例,后台程序写入数据到redis,实例,redis中数据,实例,php接口,