您需要编辑您的问题以显示 (1) 您使用的代码 (2) 完整错误和回溯 (3) 涉及的 url (4) unicode 字符是什么您正在尝试将编码为 gbk
您似乎以某种方式从 html 内容中的原始字节中获取了 unicode 字符——如何? html内容中指定了什么编码?
然后(我猜)您正在尝试将 unicode 字符写入文件,将 unicode 结束编码为 gbk。在此过程中,您收到如下错误:
>>> u'\uffff'.encode('gbk')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character u'\uffff' in position 0: illegal multibyte sequence
>>>
如果 html 内容中的原始字节不是用 gbk 编码的,那么很可能你有一些不能用 gbk 表示的 unicode 字符。在这种情况下,您可能希望使用原始编码对结果进行编码,或者将它们编码为 gb18030,它可以采用任何 unicode 字符。
另一种可能性是您以某种方式破坏了原始字节或 unicode。我当然希望你的正则表达式是在 unicode 上完成的,而不是在 gb2312、gbk 等一些可变长度字符编码上完成的。
更新:
这是你的代码 sn-p:
import sys, urllib.request
url = "http://www.meilishuo.com"
wp = urllib.request.urlopen(url)
content = wp.read()
str_content = content.decode('utf-8')
fp = open("web.txt","w")
fp.write(str_content)
fp.close()
从中我不得不推断:
(1) 您正在运行 Python 3.x
(2) sys.defaultencoding == "gbk" -- 否则您将不会收到您之前报告的部分错误消息。
由于我的 sys.defaultencoding 不是“gbk”,我将您的最后 3 行替换为gbk_content = str_content.encode('gbk'),并使用 Python 3.1.2 运行修改后的 sn-p。
观察:
(1) 网站有charset=utf-8,用utf-8解码OK
(2) 错误信息:UnicodeEncodeError: 'gbk' codec can't encode character '\u2764' in position 35070: illegal multibyte sequence
\u2664 是 dingbat(重黑色心脏)。网站是动态的;在另一次尝试中,第一个违规字符是 \xa9(版权符号)。
因此网页包含未在 gbk 中映射的 Unicode 字符。选项是
(1) 使用“gbk”进行编码,但使用“替换”选项
(2) 使用 'gbk' 进行编码,但使用 'ignore' 选项
(3) 使用支持所有 Unicode 字符(utf-8、gb18030)的编码进行编码,并且您有一个显示机制来呈现所有那些不在 gbk 中的字符