python2.7编码

来源:互联网 发布:人工智能李开复百度云 编辑:程序博客网 时间:2024/06/10 16:03

今天认真研究了一下字符编码相关的知识。

  • python2,7内部用的是Unicode,与其它编码之间的切换都要以Unicode为桥梁
  • str是使用魔种字符集编码的字符串,与unicode不同,可以用type查看
  • python默认的encoding是ascii
  • 脚本头部# coding=utf8这样的声明可以设置默认字符集,设置了之后在脚本中的str就会使用指定的字符集
python2.7中自带的json模块
  • 首先是dump和dumps,这两个方法中都有ensure_ascii和encoding参数。
        encoding指的是要序列化的对象中的str类型的值的字符集,默认是utf-8,需要注意的是这个参数并不是用于指定输出json字符串的字符集,具体见ensure_ascii参数的解释。
        ensure_ascii是True指输出的字符串是否全部使用ascii字符,非ascii字符将会以“\uXXXX“形式的字符串输出,其中“XXXX”是该字符在unicode字符集中的值的十六进制表示,比如“现代城”就是
     "\u73b0\u4ee3\u57ce",这种情况下可以保证所有字符都能通过ascii字符表示,但是会存在一个风险,就是反序列化时候必须要知道要把\uXXXX“形式的字符串作为一个unicode字符处理,否则可能出现错误。这种情况下需要使用encoding指定的字符集将非ascii字符dncode得到unicode字符。
        ensure_ascii是False指直接输出每个字符按照其当前所属的字符集中对应的值,这总情况下print序列化得到的json字符串可以直接看到字符本身。这种情况下不需要encoding,因为并不涉及字符的编码转换。需要注意的是需要序列化的对象中的str需要使用同一种字符集,如果字符集不同,那么序列化时候没问题,但是反序列化时候会出问题,见下文
  • 其次是load和loads。这两个方法中都有encoding参数。
        这两个方法反序列化得到的对象中只要是用到字符串的地方统一是unicode,而不是str。
        encoding参数作用是说明参与反序列化的json字符串使用的字符集,而不是反序列化得到的对象中的str的字符集。
        正是需要通过这个字符集将字符转换为unicode,因此在序列化时候要保证对象中的str使用同一种字符集,否则反序列化时候只能指定一种字符集就会出现问题。
        按照代码中的注释,encoding必须是an ASCII based encoding,我的理解是兼容ascii的字符集,
    not ASCII based encoding are not allowed,给出的例子是(such as UCS-2) ,但是我搜了一下发现UCS-2是指用两个字节表示一个unicode字符的值,这就比较懵逼了,希望有大神赐教,不胜感激


原创粉丝点击