zoukankan      html  css  js  c++  java
  • python 中文编码笔记

    最近碰了很多钉子。。。

    不得不说,python2.6相较于之前发布的版本,就编码方面来说,有明显的进步。本机使用的是python2.6,同样的代码根本没有遇到问题。到了服务器上部署时,一台服务器的python2.5和另一台服务器的python2.4,都折磨得我苦不堪言。

    先厘清几个概念:python内置的字符类型是unicode,当需要进行编码转换时,都要先转成unicode,然后再转换成目标编码。而str类型是二进制类型,例如

      声明变量uniStr=u'的',uniStr的类型为Unicode

      执行gbStr=uniStr.encode('gb2312'),则gbStr的类型为str,长度为18字节(gb2312标准里用两个字节表示一个汉字)。

      若执行gbStr.encode('gb2312'),则会报错,因为'ascii' codec can't decode byte 0xd3 in position 0: ordinal not in range(128)。

    关于unicode:unicode可以想象成一个比ascii大得多的码表,能够包含所有现存字符。每个字符有一个对应的编码,编码的范围是0到0x10ffff,那么我们可以使用32位的int来储存一个unicode字符。但这样比较浪费空间,人们就提出了别的编码方案,例如utf-8。简而言之,编码方案就是把unicode值映射成字节流,术语是encoding。

    python默认的编码方案是ascii,所有超过128的unicode编码都会报UnicodeEncodeError。

    utf-8方案编码方案是应用较广的一种,编码规则如下:

    • unicode编码值小于128,原封不动;
    • unicode编码值在128到7ff,将转换为2个字节,每字节值范围在128到255之间;
    • unicode编码值大于7ff的,将转换为3-4个字节,每字节值范围在128到255之间。
    为了应付编码问题,可以用repr()函数,type()函数来一探究竟。type能够告诉你这是unicode还是str,如果通过repr看到形如u'\ua000'的串,一般就是unicode了。\u和\U的区别是一个用4位16进制数表示,一个是8位16进制数表示。ord()函数可以返回一个unicode字并返回它的unicode编码(还记得上面提到的那张大码表吗?这编码就是在表中的索引值)。
  • 相关阅读:
    Chrome 请求过滤扩展实现
    【译】Chrome 扩展 : 入门
    【译】Chrome 扩展 : 扩展是什么?
    【译】Chrome 扩展 : 欢迎
    事务处理
    nrm ls报错解决办法
    Typescript学习总结
    常用插件收藏
    css 设置滚动条样式
    vscode 常用插件
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/python_encode_decode.html
Copyright © 2011-2022 走看看