Presentation is loading. Please wait.

Presentation is loading. Please wait.

谈谈Python编码问题和Unicode

Similar presentations


Presentation on theme: "谈谈Python编码问题和Unicode"— Presentation transcript:

1 谈谈Python编码问题和Unicode

2 outline Unicode基础知识 Python的str和unicode Json编码工具 实例

3 Unicode Ascii时代 MBCS时代(多字节字符集) Unicode 7位,最高位是校验位
中文CP963,GBK,GB2312,BIG5 Unicode Unicode16,Unicode32

4 Big Endian & Little Endian Host Byte Order & Network Byte Order
题外话:存在与表示 Big Endian & Little Endian SPARK, x86, ARM Host Byte Order & Network Byte Order htonl, ntohl, htons, ntohs Object Persistence & Serialize MFC, java serialiable interface and persistence api, protobuf Unicode & UTF, UCS Several mechanisms have been specified for implementing Unicode.

5 Unicode Transformation Format (UTF)
unicode & utf unicode unicode16, unicode32 Unicode Transformation Format (UTF) UTF16(Big/Little Endian) UTF32(Big/Little Endian) UTF8 变长方案 思考?为什么是变长的?如何实现?

6 str用来存储各种utf数据,包括gbk等 可以认为:unicode对象是理想的unicode,str是丑陋的现实(各种utf)
Python str & unicode str对象 存储ascii字符串,以及二进制数据 unicode对象 存储unicode字符串,采用的是utf16或utf32 str用来存储各种utf数据,包括gbk等 可以认为:unicode对象是理想的unicode,str是丑陋的现实(各种utf)

7 str与unicode的转化

8 使用时机 拇指定律 例子 IO时用str 内部处理时用unicode 从外部读入时它是str 转为unicode进行必要处理
e.g. network, file read write 内部处理时用unicode json encode, string process 例子 从外部读入时它是str 转为unicode进行必要处理 再转为str输出

9 demo 体验demo.py

10 我懂了上面说的,为什么json还是搞不定?
import json 我懂了上面说的,为什么json还是搞不定? 嗯,因为json帮你encode,decode了一些东西 需要仔细阅读json模块的文档

11 json.dumps(obj, ensure_ascii,encoding...)
obj python数据结构: dic, list ... ensure_ascii = True(default) dumps返回一个str ensure_ascii = False dumps返回一个unicode!我们可以进一步对它encode encoding 在obj进行转化之前,所有obj中的str会转为unicode,即str.decode(encoding) 默认情况: str -> unicode -> json(unicode) -> str

12 json.dumps(d, encoding='gbk')
一个默认处理 json.dumps(d, encoding='gbk') 它返回一个str str -> unicode -> json(unicode) -> str str->unicode的decode在 encoding参数控制 json(unicode) -> str 这里的encoding是默认控制的! 这个默认控制不是encode,而是直接把unicode转义为ascii编码,这个ascii码的内容是unicode! 这里应该是个utf8,这个过程是个硬编码:见lib中encode.py

13 证据 老白干酒 utf8 : 0x8001 0x767D 0x5E72 0x9152 gbk : 0xC0CF 0xB0D7 0xB8C9 0xBEC6

14 JSON本身的规范和实现 有了以上知识,我们还有可能搞不定特定需求:比如,请给我弄个GKB的字符串! JSON规范定义string必须是unicode字符串,但是实现形式默认是utf8 有些json解析函数仅实现了utf8,不支持其他格式!

15 实例 后台程序写入数据到redis

16 实例 redis中数据

17 实例 php接口


Download ppt "谈谈Python编码问题和Unicode"

Similar presentations


Ads by Google