Python学习笔记之编码问题 unicode、encode、decode

时间:2023-01-04 19:56:55
在所有字符集中,最知名的可能要数被称为ASCII的7位字符集了。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。
但是,由于他是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的欧洲文字时就会出现问题。
把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个字节就可以编码地球上几乎所有地区的文字。因此,创建了UNICODE编码。它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。

事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。常见的UTF格式有:UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。


ivan_utf8='Ivan Krstić'
ivan_uni = ivan_utf8.encode('utf-8')
>>> ivan_utf8[-1]
python3报错,最后一个字符直接打不出来:UnicodeEncodeError: 'gbk' codec can't encode character '\x87' in position 0
>>> ivan_utf8[-1].encode('utf-8')
编个码也就是换成i van_uni[-1] 打出来是 b'\xc4\x87'
>>> type(ivan_utf8)
<class 'str'> 编码前是字符
>>> type(ivan_uni)
<class 'bytes'> 编码后变成字节
>>> len(ivan_utf8)
11
>>> len(ivan_uni)
12
\xc4\x87算两个


decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
有时python3会报错:AttributeError: 'str' object has no attribute 'decode'
因为python3里str默认为 unicode 了吧。只能编码 encode 不能解码 decode。


Unicode in Python 3

    they fixed Unicode!
    <type 'str'> is a Unicode object ——所以str不能解码了,因为默认是 unicode
    separate <type 'bytes'> type ——有 b 什么什么的类型了
    all builtin modules support Unicode
    no more u'text' syntax ——默认 u 了,没有 u 什么什么的这种显示了

    open() takes an encoding argument, like codecs.open()
    default encoding is UTF-8 not ASCII
        woo! ——open 文件会直接编码成 utf-8
    Tries to guess the file encoding
        You will still need to declare encodings ——最好猜测文件编码类型是 utf-8


http://farmdev.com/talks/unicode/
这个文档主要针对python2



___________2016更新___________

字符串1:\u5168\u7403\u7ecf\u5178IT\u6570\u7801\u6392\u884c\u699c
解决方法:
1.decode("unicode_escape")
2.多谢“qinjianxiang”帮忙
print u'\u5168\u7403\u7ecf\u5178IT\u6570\u7801\u6392\u884c\u699c'.encode('utf-8')
其中,u前缀告诉Python后面的字符串要编成unicode字符串

字符串2:&#19968;&#24180;&#19968;&#24230;&#30340;
解决方法:多谢“qinjianxiang”帮忙
import HTMLParser
h = HTMLParser.HTMLParser()
print h.unescape('&#19968;&#24180;&#19968;&#24230;&#30340;')

来源:https://segmentfault.com/q/1010000000344967


list没法encode:
github上有个uniout插件,可转化list中的编码(我没试)
https://github.com/moskytw/uniout
Python