作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [问题] utf8 & cp950
时间Tue Sep 24 22:48:22 2013
※ 引述《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
1F:推 sweslo17:受益良多 感谢uranusjr大 09/24 23:04
2F:推 lc85301:好强喔OAO 09/25 21:32
3F:推 timTan:这个回文让人感动阿! 09/26 11:38
4F:推 vic0330:深度文啊! 10/27 04:44
5F:推 a78998042a: 感谢大大开示 07/13 21:57