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

2024-04-19

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

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

这是表条目utf-8 codec.

编解码器别名 目的

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 标准进行编码。将 Unicode 文本编码为 UTF-8 通常不会引发异常。

来自关于编解码器的维基百科文章 https://en.wikipedia.org/wiki/UTF-8:

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

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

>>> 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模块也可以,只需使用encode方法上的unicode object:

return item.encode('utf-8')

在Python 3中,情况稍微复杂一些。解码和编码代理对 https://en.wikipedia.org/wiki/UTF-16#U.2BD800_to_U.2BDFFF受到限制;官方标准规定此类字符只能出现在 UTF-16 编码数据中,并且只能出现在低位和高位对中。

因此,您需要明确声明您希望支持此类代码点surrogatepass错误处理程序 https://docs.python.org/3/library/codecs.html#error-handlers:

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

之间唯一的区别surrogatepass and strict就是它surrogatepass将允许您将 Unicode 文本中的任何代理代码点编码为 UTF-8。您只会在极少数情况下获得此类数据(定义为文字,或者意外地将此类代码点保留在 UTF-16 中不配对,然后使用surrogatepass).

所以,在 Python 3 中,仅当您有机会使用 Unicode 文本生成时surrogatepass解码或从文字数据,你需要使用item.encode('utf8', 'surrogatepass')绝对确定所有可能的 Unicode 值都可以被编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以构造一个utf-8编解码器无法编码的unicode字符串? 的相关文章

随机推荐

  • 打破parallel.foreach?

    我怎样才能摆脱困境并行 for http msdn microsoft com en us library system threading tasks parallel for aspx loop 我有一个非常复杂的声明 如下所示 Par
  • 如何使用Git在不同平台上拥有不同的工作目录结构?

    在 Windows 上我们有root folder1 root folder2 root folder3 在Linux上我们有root folder1 folder2 root folder1 folder3 我强烈希望不要使用子模块或子树
  • 复选框的自定义图片?

    我想将复选框显示为切换按钮 但我无法使用 CCS 将自定义图片应用到它 仍然绘制复选框 如何完成这个任务呢 My CSS input type checkbox settingsbutton border style none backgr
  • Eloquent ORM(laravel 5) 是否负责 SQL 注入?

    我在网上找不到它 但是 Eloquent ORM 是否像 PDO 准备好的语句一样处理 SQL 注入 没有任何框架能够 处理 SQL 注入 You处理 SQL 注入 框架可以提供方便地执行此操作的方法 但您仍然必须一致地使用这些方法 例如
  • CUDA素数生成

    当数据大小增加超过 260k 时 我的 CUDA 程序停止工作 它不打印任何内容 有人能告诉我为什么会发生这种情况吗 这是我的第一个 CUDA 程序 如果我想要更大的素数 如何在 CUDA 上使用大于 long long int 的数据类型
  • 在 Hive 中获取空值 使用 REGEX 创建和加载查询

    我有一个日志文件 我需要在其中使用 REGEX 存储数据 我尝试了下面的查询 但加载了所有 NULL 值 我已经检查了 REGEXhttp www regexr com http www regexr com 它对我的 数据工作正常 CRE
  • 从 VideoView 录制视频

    目前在做直播项目 成功实现视频直播 现在我的下一个任务是录制 VideoView 中正在播放的视频 我进行了搜索 能够找到捕获视频 但使用表面 相机 但在 VideoView 中我没有任何表面 任何帮助表示赞赏 你可以看到this http
  • 支持多屏幕的应用程序骨架

    正如我们所知 Android 随各种设备一起提供 这些设备具有不同的功能 功能 分辨率和屏幕尺寸 因此在开发支持的应用程序时 多个 小和大 屏幕存在尺寸和布局障碍 这导致了不同的组合屏幕尺寸 分辨率和 DPI这给 Android 设备的设计
  • gem install pg 错误:无法理解 Yosemite w/ Ruby 2.1.5 上的 kern.osversion `14.0.0'

    我使用 RVM 安装 Ruby 2 1 5 并再次运行捆绑包 现在 pg gem 无法安装 我收到此错误 gem install pg v 0 17 1 with pg config Applications Postgres app Co
  • c# 如何在 select 语句中指定 not ?

    我在数据集上使用 select 方法来检索符合我的条件的结果 foreach DataRow dr in dsPone2 Tables tt pone Select strWhereCondition dsPone Tables tt po
  • Tensorflow 中的平衡准确度分数

    我正在为高度不平衡的分类问题实现 CNN 并且我想在张量流中实现自定义指标以使用 选择最佳模型 回调 具体来说 我想实现平衡的准确度分数 这是每个类别的召回率的平均值 请参阅 sklearn 实现here https scikit lear
  • 如何将一个word文档的内容复制到另一个word文档中?

    我有一个包含一些文本和图像的Word文档 我想使用C 将word文档的内容复制到另一个word文档中 Thanks 尝试下面的代码 这可能对你有帮助 using System using System Collections Generic
  • Android 与 gms play 服务的依赖问题

    我收到一个错误 因为我正在尝试使用来自 Google 的应用程序索引库 同时还导入一个库 该库使用旧版本的 android gms 库作为不同的组件 来自 Google Play 服务的转换库 错误指出 所有 com google andr
  • delta Lake - 在 pyspark 中插入 sql 失败,并显示 java.lang.NoSuchMethodError: org.apache.spark.sql.catalyst.expressions.Alias

    Dataproc 集群是使用映像创建的2 0 x带有 Delta io 包io delta delta core 2 12 0 7 0 Spark版本是3 1 1 Spark shell 启动于 pyspark conf spark sql
  • “无法转换为 IComparer”

    我为装箱的RegistryItem对象定义了以下IComparer public class BoxedRegistryItemComparer IComparer public int Compare object left object
  • GPUImageAlphaBlendFilter 来自 GPUImageStillCamera 源的实时处理

    我正在使用 GPUImage 库 我正在尝试实时混合两个图像 并将它们显示在GPUImageView 我正在尝试将普通相机输入与其过滤版本进行 alpha 混合 这是我想做的 gt v camera alpha blend gt image
  • 多个docker容器日志

    我试图一次从多个 Docker 容器获取日志 顺序无关紧要 这将按预期工作 如果types ContainerLogsOption Follow设置为 false If types ContainerLogsOption Follow设置为
  • 获取鼠标下的窗口值

    我正在使用 Cocoa Objective C 我想问你是否可以从非活动窗口获取窗口信息 例如 pid 窗口名称 我的确切意思是 如果有两个不同任务的非全屏 也不是最大化 窗口 A 和 B 比如说 Chrome A 和 Firefox B
  • 是否可以在 C# 中为可空值和不可空值编写隐式转换运算符?

    我正在尝试写一个Alias课程使我能够 int n new Count 1 也就是说 它封装了一个int在这种情况下作为Count 它提供了一些类型安全性和域含义 同时它自动转换回底层类型 对于不可为空的引用类型 我还有另一个问题 我无法弄
  • 是否可以构造一个utf-8编解码器无法编码的unicode字符串?

    是否可以构造一个 unicode 字符串utf 8编解码器无法编码 从文档 https docs python org 2 library codecs html https docs python org 2 library codecs