為什麼這篇Python UTF-8鄉民發文收入到精華區:因為在Python UTF-8這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者uranusjr (←這人是超級笨蛋)看板Python標題Re: [問題] utf8 &...
※ 引述《sweslo17 (smigo)》之銘言:
: 程式碼:
: http://ideone.com/PFYV3X
我假設你是用了這個 lib http://docs.python-requests.org/en/latest/
Python 本身沒有內建 requests 這個 module
你應該要在原文內提到它的來源
: 使用版本是Python 3.3
: 在win7上執行會出現以下錯誤:
: Traceback (most recent call last):
: File "test.py", line 17, in <module>
: print (response.text.encode('cp950'))
: UnicodeEncodeError: 'cp950' codec can't encode character '\u30fc' in position
: 29222: illegal multibyte sequence
: 有查了一些資料 也知道是編碼的問題
: response.text的型態是str應該已經是utf-8
你的字元編碼概念需要砍掉重練
response.text 在 Python 3 是 str, 所以是 Unicode 序列
它本身沒有編碼概念
推薦閱讀
http://www.csie.ntu.edu.tw/~p92005/Joel/Unicode.html
如果你消化完上面那篇文章, 應該會瞭解到 Unicode 序列本身不可能會有錯誤[*]
所以你的錯誤顯然在 encode
而如果你在上來發問前有進行過基本的嘗試
應該會發現 print(response.text.encode()) 不會發生錯誤
encode 不帶引數時預設是以 UTF-8 字元集進行編碼
所以問題在於你輸入的 Unicode 字元可以被 UTF-8 編碼, 但無法被 CP950 編碼
為什麼會這樣?
CP950 是 Windows 的 Big-5 擴充, 後者則是對 ASCII 的擴充
這些編碼(相對於 UTF-8)的共同點為擁有最大字元寬度
ASCII 是固定 8-bit, Big-5 和 CP950 則是 8 或 16-bit
所以它們可編碼的字元有限
而由於他們是針對(繁體)漢語世界發展的擴充
它們可編碼的字元以英數與繁體中文字符為主
回到你的程式本身
'\u30fc', 亦即 Unicode 字元編號 0x30fc, 是日語片平假名的長音符號
(正式名稱為 KATAKANA-HIRAGANA PROLONGED SOUND MARK)
CP950 不包含日語假名字符, 所以當然無法編碼這個字元
所以會產生你遇到的錯誤
解法?最好的解法就是不要用 CP950, 改用 UTF-8
或者如果你因為某種特殊原因非用 CP950 不可
可以多喂一個引數給 encode
根據 documentation
http://docs.python.org/3/library/stdtypes.html#str.encode
encode 可以接受第二個引數指明當無法編碼某個字元時應採取的行為
預設的 'strict' 會引發你看到的 exception
但其實有其他的選擇
[*] 如果你無法自己理解原因, 我建議你重看文章直到想通為止
: 不知道為什麼還是會出現錯誤??
: 而且在這樣的行況下也無法寫檔 一樣會出現encode錯誤
: 請各位大大幫忙看看Orz.....
--
"問おう、貴方が私のマスターか?"
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146