可能重复:
将Unicode转换为UTF-8 Python
我是一个非常新的python程序员,正在编写我的第一个脚本。该脚本从plist字符串中提取文本,然后对其执行一些操作,然后将其打包为HTML电子邮件。
从一些条目中,我得到了可怕的Unicode“外部序号128”错误。
在阅读了尽可能多的关于编码和解码的内容后,我知道编码对我来说很重要,但是我很难理解何时或者如何做到这一点。
首先使用plistlib将违规变量拉进来,并从makdown转换为超文本标记语言,如下所示:
entry = result['Entry Text']
donotecontent = markdown2.markdown(entry)
之后,它会像这样被放在电子邮件中:
html = donotecontent + '<br /><br />' + var3
part1 = MIMEText(html, 'html')
msg.attach(part1)
我的问题是,对我来说,什么是最好的方法来确保此内容中的Unicode字符不会导致抛出错误。我更喜欢不忽视角色。
记住:你不能解码一个Unicode,你不能编码一个str
>>> u"\xa0".decode("ascii", "ignore")
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
u"\xa0".decode("ascii", "ignore")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 0: ordinal not in range(128)
>>> "\xc2".encode("ascii", "ignore")
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
"\xc2".encode("ascii", "ignore")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
查看这篇优秀的教程
假设您使用的是Python 2. x,请记住:有两种类型的字符串:str
和Unicode
。str
是字节字符串,而Unicode
是Unicode字符串。可以使用Unicode
字符串要表示任何语言的文本,但要在计算机中存储文本或通过电子邮件发送文本,您需要使用字节表示文本。要使用字节表示文本,您需要一种编码格式。编码格式有很多,Python默认使用ascii,但是ascii只能代表几个字符,大部分是英文字母。如果您尝试使用ascii将文本与其他字母编码,您将获得著名的“外部序数128”。例如:
>>> u'Cerón'.encode('ascii')
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 3:
ordinal not in range(128)
如果使用str(u'ceron')
,也会发生同样的情况,因为Python默认使用ascii将unicode
转换为str
。
要做到这一点,您必须使用不同的编码格式。UTF-8是一种编码格式,可以将任何Unicode文本表示为字节。要将u'Cerón'
Unicode字符串转换为字节,您必须使用:
>>> u'Cerón'.encode('utf-8')
'Cer\xc3\xb3n'
这次没有错误。
现在,回到你的电子邮件问题。我可以看到您正在使用MIMEText
,它接受一个已经编码的str
参数,在您的情况下是html
变量。MIMEText
也接受一个参数,指定使用哪种编码。因此,在您的情况下,如果html
是一个Unicode字符串,您必须将其编码为utf-8
并传递charset参数(因为HTMLText
默认使用ascii):
part1 = MIMEText(html.encode('utf-8'), 'html', 'utf-8')
但是要小心,因为如果html
已经是str
而不是unicode
,那么编码就会失败。这是Python2的问题之一。x、 它允许您对已编码的字符串进行编码,但会引发错误。
另一个需要添加到列表中的问题是utf-8与ascii字符兼容,Python将始终尝试使用ascii自动编码/解码字符串。如果您没有正确编码字符串,但您只使用ascii字符,事情会很顺利。但是,如果由于某种原因,一些非ascii字符滑入您的消息,您将获得错误,这使得错误更难检测。
抱歉我蹩脚的英语。我说中文/日语,每天使用CJK字符。Ceron几乎解决了这个问题,因此我不会再讨论如何使用encode()
/decode()
。
当我们使用str()
强制转换任何unicode对象时,它将unicode字符串编码为bytedata;当我们使用unicode()
来转换str
对象时,它会将bytedata解码为unicode字符。
并且,编码必须是从sys返回的。getdefaultencoding()
。
默认情况下,sys。getdefaultencoding()
返回“ascii”默认情况下,在执行str()
/unicode()
强制转换时可能会引发编码/解码异常。
如果你想做str
import sys # sys.setdefaultencoding is cancelled by site.py
reload(sys) # to re-enable sys.setdefaultencoding()
sys.setdefaultencoding('utf-8')
它将导致以后执行str()
和unicode()
转换任何编码为utf-8的基串对象。
但是,我更喜欢显式地使用encode()
/decode()
,因为它使代码维护更容易。
问题内容: 我的代码只是刮取一个网页,然后将其转换为。 但是我得到了: 我认为这意味着HTML在某处包含一些错误的Unicode尝试。我能丢掉导致问题的任何代码字节而不出错吗? 问题答案: 使用类似的压缩已变得非常流行(约73%的网站都在使用它,包括和网站等大型网站)。 如果你像原始答案中那样使用压缩响应进行简单解码,则会收到类似以下错误: 编解码器无法解码位置1的字节0x8b 为了解码gzpip
问题内容: 我正在做一些抓取,并且站点经常使用实体来表示非字符。Python是否有一个实用程序可以接受带有实体的字符串并返回类型? 例如: 我回来了: 代表带有音调标记的。以二进制形式表示为16位01ce。我想将html实体转换为值 问题答案: 标准库自己的具有未记录的函数,它完全按照你的想法执行操作:
问题内容: 我有一个包含unicode字符等的字符串,以某种方式不被我接收,但被作为接收。如何将其转换回unicode? 显然不是答案。那是什么 问题答案: Unicode转义仅适用于unicode字符串,因此 实际上是由6个字符组成的字符串:“ \”,“ u”,“ 2”,“ 0”,“ 2”,“ 6”。 要从中制作出unicode,请使用:
问题内容: 如果明确定义,以下unicode和字符串可以单独存在: 如果只分配了上述变量,如何在Python 2.5或2.6中将其转换为? 编辑: 我做了以下事情: 解决了我的问题。有人可以向我解释到底发生了什么吗? 问题答案: 您似乎混淆了编码。看来您真正想要的是等效于。 但是您似乎是被错误解码的UTF-8编码。您可以通过将unicode字符串转换为普通字符串来解决此问题。我不确定最好的方法是什
问题内容: 当我尝试使用“ unicode(head.contents [3])”获取标签的内容时,我得到类似于以下的输出:“ Christensen Sk \ xf6ld”。我希望转义序列作为字符串返回。如何在python中做? 问题答案: 假设Python将名称视为普通字符串,则首先必须将其解码为unicode: 实现此目的的另一种方法: 注意字符串前面的“ u”,表示它是未编码的。如果进行打
问题内容: 我想将从文件中读取的unicode代码点转换为它们的UTF8编码。 例如,我想将字符串转换为字符串。 我可以使用这样的字符串文字手动完成此操作: 但我无法确定如何以编程方式进行操作。 问题答案: 使用内置函数将数字转换为字符,然后对其进行编码: 这是字符串本身。如果您希望字符串为ASCII十六进制,则需要使用或类似的方法逐步将每个字符转换为十六进制。 注意 :如果您仍然对Python
问题内容: 我无法在不丢失数据的情况下将以下Unicode转换为ASCII: 我尝试了,他们不会这样做。 有人有建议吗? 问题答案: Unicode字符,并且没有任何对应的ASCII值。因此,如果您不想丢失数据,则必须以某种有效的ASCII方式对数据进行编码。选项包括: 所有这些都是ASCII字符串,并且包含来自原始Unicode字符串的所有信息(因此可以将它们全部逆转而不会丢失数据),但是对于最
问题内容: 我有unicode ,我希望它以字典格式。 我想要它的格式。 我试过了,但它返回的字符串不是字典。 谁能帮我? 问题答案: 您可以使用内置包: 帮助ast模块中的literal_eval函数: literal_eval(node_or_string) 安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字