【发布时间】:2017-05-05 00:36:59
【问题描述】:
是否可以构造utf-8编解码器无法编码的unicode字符串?
从文档 (https://docs.python.org/2/library/codecs.html) 看来,utf-8 编解码器可以用“任何语言”对符号进行编码。文档还注意到编解码器何时只能编码某些字符或只能编码基本多语言平面。我不知道这是否等同于说“不可能构造一个无法使用utf-8 编解码器转换为字节串的unicode 值”。
这是utf-8 编解码器的表条目。
编解码器别名用途
utf_8 U8、UTF、utf8 所有语言
这里的动机是我有一个实用函数,它接受一个 unicode 字符串或一个字节字符串并将其转换为一个字节字符串。当给定一个字节字符串时,它是一个空操作。除非使用非字符串类型调用此函数,否则不应抛出异常,在这种情况下,它应该以稍后捕获并记录的 TypeError 提示失败。 (如果我们尝试插入到异常消息中的项目的 repr 太大,我们仍然会遇到问题,但我们暂时忽略它。
我正在使用strict 设置,因为我希望此函数在遇到无法编码的 unicode 对象时抛出异常,但我希望这是不可能的。
def utf8_to_bytes(item):
"""take a bytes or unicode object and convert it to bytes,
using utf-8 if necessary"""
if isinstance(item, bytes):
return item
elif isinstance(item, unicode):
return codecs.encode(item, 'utf-8', 'strict')
else:
raise TypeError("item must be bytes or unicode. got %r" % type(item))
【问题讨论】:
-
我不认为我的问题是不明智的。是的,
utf-8能够编码任何有效的 unicode 代码点序列……但这并不意味着先验地不可能在 python 中构造一个不可编码的 unicode 对象。
标签: python python-2.7 unicode utf-8