星期日, 1月 11, 2015

Unicode, UTF-8, UTF-16, Python 2.x, 3.x 中文編碼

Unicode, UTF-8, UTF-16, BOM的說明

Reference: http://dnowba.blogspot.tw/2012/07/ansiunicodeutf-8utf-16bom.html

在命令提示視窗(Command Prompt)顯示UTF-8內容


http://blog.darkthread.net/post-2011-08-11-command-prompt-codepage.aspx

摘要:

  • Unicode (=UTF-16), 固定2bytes來編碼,解決多國語系呈現問題。
  • Unicode轉換格式(Unicode Transformation Format,簡稱為UTF)
  • UTF-8可變動式編碼,英文數字用1 byte來編、中文通常用3 bytes編碼。設計目的在於英語系資料可只用1碼,大幅簡少原Unicode 2碼的空間浪費。
  • BOM (Unicode Byte Order Mark),在檔頭加上二個byte的空間,為了解決CPU的BE和LE的問題。(早期Mac 系統主要是 Big Endian(BE), PC 系統則是使用 Little Endian(LE)。)
  • Difference between Big Endian and little Endian Byte order, http://stackoverflow.com/questions/701624/difference-between-big-endian-and-little-endian-byte-order
  • UTF-8在Windows軟體(如記事本)存檔時,可能會加入EF BB BF這個BOM,因為UTF-8編碼可以透過演算法偵測,理論上是沒必要的。所以Linux及Mac上的文字編輯器都不會加,造成一些程式碼在Linux及Mac平台上處理會有問題。

Python 2.x及 3.x的編碼

Python 2.x’s support for Unicode, Reference: https://docs.python.org/2/howto/unicode.html
Python 3.x’s support for Unicode, Reference: https://docs.python.org/3/howto/unicode.html
python 的編碼, http://openhome.cc/Gossip/Encoding/Python.html

摘要:


  • 在Python 2.x,程式中所有字串,其實都是原始位元組集合。也就是傳統的ascii編碼。
  • 如果原始碼中寫了非ASCII字元串,必須在第一行放置編碼聲明(encoding declaration)。例如:# coding=Big5。在上面情況下,len('中文')函式結果會是以byte來計算=4
  • 一般建議,第一行編碼聲明為# coding=utf-8
  • Unicode不等於utf-8編碼,所以讀取及儲存Utf-8資料,需要進行轉碼,轉成Unicode再處理。
  • 為了支援Unicode,Python 2.x提供了u前置字來產生unicode物件。len(u'中文')函式結果會是以真正的"字數"來計算=2
  • 在2.x中,可以用 s = unicode('abcdef')語法建立unicode,unicode() 建構式的原形 unicode(string[, encoding, errors]),其中encoding預設的編碼是ASCII,建構式會把string 參數內容,根據由encoding參數所指定的編碼,如ASCII轉成unicode。如果沒有改變編碼,直接用預設方式建立中文字,如unicode('中文')會產生錯誤,如UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 6。必須指定原始編碼,unicode()函式才能安全的把原生編碼轉過去Unicode, e.g, unicode('中文', 'big-5')。
  • unicode的encode()方法則可指定實現編碼,將之轉為代表位元組實現的str實例。即把字串從unicode--> big5。
  • 假如text文字為unicode,呼叫b_str = text.encode('big5')則會回傳big5的文字回去b_str。
  • 原生字串str的decode()會將字串轉換為unicode物件。即把字串從big--> unicode。
  • 假如b_str文字為原生字串,b_str.decode('big5')則會回傳Unicode的文字回去。


  • 在Python 3.x中,預設.py檔案必須是UTF-8編碼。如果.py檔案想要是UTF-8以外的編碼,同樣必須在第一行放置編碼聲明。
  • Python 3.x中的字串都是Unicode。

沒有留言: