Re: [問題] utf8 & cp950
※ 引述《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
推
09/24 23:04, , 1F
09/24 23:04, 1F
推
09/25 21:32, , 2F
09/25 21:32, 2F
推
09/26 11:38, , 3F
09/26 11:38, 3F
推
10/27 04:44, , 4F
10/27 04:44, 4F
推
07/13 21:57, , 5F
07/13 21:57, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):