看板 Python 關於我們 聯絡資訊
※ 引述《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
sweslo17:受益良多 感謝uranusjr大 09/24 23:04
lc85301:好強喔OAO 09/25 21:32
timTan:這個回文讓人感動阿! 09/26 11:38
vic0330:深度文啊! 10/27 04:44
a78998042a: 感謝大大開示 07/13 21:57