首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >能否构造utf-8编解码器无法编码的unicode字符串?

能否构造utf-8编解码器无法编码的unicode字符串?
EN

Stack Overflow用户
提问于 2016-12-19 21:35:35
回答 1查看 1.5K关注 0票数 2

是否可以构造utf-8编解码器无法编码的unicode字符串?

从文档(https://docs.python.org/2/library/codecs.html)来看,utf-8编解码器似乎可以用“任何语言”对符号进行编码。当编解码器只能编码某些字符或只编码基本的多语言平面时,docs也会注意到。但是,我不知道这是否等同于“无法使用unicode编解码器构造不能转换为字节串的utf-8值”。

下面是utf-8编解码器的表条目。

编解码别名用途 utf_8 U8,UTF,utf8所有语言

这里的动机是,我有一个实用程序函数,它接受unicode字符串或字节字符串,并将其转换为字节字符串。当给定一个字节字符串时,它是不操作的。这个函数不应该抛出异常,除非它是用非字符串类型调用的,在这种情况下,它应该以非正式的方式失败,TypeError将在稍后被捕获并记录下来。(如果我们试图插入到异常消息中的项太大,我们仍然会遇到问题,但是现在让我们忽略这一点)。

我使用strict设置是因为我希望这个函数在遇到它无法编码的unicode对象时抛出一个异常,但我希望这是不可能的。

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-19 21:37:06

UTF-8被设计成编码所有Unicode标准。将Unicode文本编码到UTF-8通常不会引发异常。

来自维基百科关于编解码器的文章

UTF-8是一种字符编码,能够编码由Unicode定义的所有可能的字符或代码点。

据我所知,Python2UTF-8编码没有边缘情况;非BMP数据和代理项对的处理方式相同:

代码语言:javascript
复制
>>> import sys
>>> hex(sys.maxunicode)  # a narrow UCS-2 build
'0xffff'
>>> len(u'\U0001F525')
2
>>> u'\U0001F525'.encode('utf-8')
'\xf0\x9f\x94\xa5'
>>> u'\ud83d\udd25'
u'\U0001f525'
>>> len(u'\ud83d\udd25')
2
>>> u'\ud83d\udd25'.encode('utf-8')
'\xf0\x9f\x94\xa5'

注意,strict是默认的编码模式。您也不需要使用codecs模块,只需在unicode对象上使用encode方法:

代码语言:javascript
复制
return item.encode('utf-8')

在Python 3中,情况稍微复杂一些。解码和编码https://en.wikipedia.org/wiki/UTF-16#U.2BD800_to_U.2BDFFF是受限制的;官方标准规定,这些字符只应出现在UTF-16编码的数据中,然后只出现在低对和高对中。

因此,您需要显式地声明您希望使用错误处理程序支持这些代码点。

允许代理代码的编码和解码。这些编解码器通常将代孕者的存在视为错误。

surrogatepassstrict之间唯一的区别是,surrogatepass将允许您将Unicode文本中的任何代理代码点编码到UTF-8。只有在罕见的情况下(定义为文字,或者在UTF-16中不成对的代码点不成对的情况下,然后使用surrogatepass解码),才能得到这样的数据。

因此,在Python3中,只有当您有可能使用surrogatepass解码或文字数据生成Unicode文本时,您才需要使用item.encode('utf8', 'surrogatepass')来绝对确定所有可能的Unicode值都可以编码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41231414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档