在所有字符集中,最知名的可能要數被稱為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:一年一度的
解決方法:多謝“qinjianxiang”幫忙
import HTMLParser
h = HTMLParser.HTMLParser()
print h.unescape('一年一度的')
來源: https://segmentfault.com/q/1010000000344967
list沒法encode:
github上有個uniout插件,可轉化list中的編碼(我沒試)
https://github.com/moskytw/uniout
但是,由於他是針對英語設計的,當處理帶有音調標號(形如漢語的拼音)的歐洲文字時就會出現問題。
把漢語、日語和越南語的一些相似的字符結合起來,在不同的語言里,使不同的字符代表不同的字,這樣只用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:一年一度的
解決方法:多謝“qinjianxiang”幫忙
import HTMLParser
h = HTMLParser.HTMLParser()
print h.unescape('一年一度的')
來源: https://segmentfault.com/q/1010000000344967
list沒法encode:
github上有個uniout插件,可轉化list中的編碼(我沒試)
https://github.com/moskytw/uniout
