Python 对于单个 Unicode 字符串返回长度为 2

2024-01-30

在 Python 2.7 中:

In [2]: utf8_str = '\xf0\x9f\x91\x8d'
In [3]: print(utf8_str)
????
In [4]: unicode_str = utf8_str.decode('utf-8')
In [5]: print(unicode_str)
???? 
In [6]: unicode_str
Out[6]: u'\U0001f44d'
In [7]: len(unicode_str)
Out[7]: 2

Since unicode_str只包含一个 unicode 代码点 (0x0001f44d),为什么len(unicode_str)返回 2 而不是 1?


您的 Python 二进制文件是使用 UCS-2 支持编译的(anarrowbuild),并且内部 BMP(基本多语言平面)之外的任何内容都使用代理对 https://en.wikipedia.org/wiki/UTF-16#U.2B10000_to_U.2B10FFFF.

这意味着在询问长度时,此类代码点会显示为 2 个字符。

如果这很重要,您必须重新编译 Python 二进制文件才能使用 UCS-4 (./configure --enable-unicode=ucs4将启用它),或升级到 Python 3.3 或更高版本,其中Python 对 Unicode 支持进行了彻底修改 https://docs.python.org/3/whatsnew/3.3.html#pep-393使用可变宽度 Unicode 类型,根据所包含的代码点的需要在 ASCII、UCS-2 和 UCS-4 之间切换。

在 Python 版本 2.7 和 3.0 - 3.2 上,您可以通过检查来检测您拥有的构建类型sys.maxunicode value https://docs.python.org/2/library/sys.html#sys.maxunicode;这将是2^16-1 == 65535 == 0xFFFF对于狭窄的 UCS-2 构建,1114111 == 0x10FFFF适用于广泛的 UCS-4 构建。在 Python 3.3 及更高版本中,它始终设置为 1114111。

Demo:

# Narrow build
$ bin/python -c 'import sys; print sys.maxunicode, len(u"\U0001f44d"), list(u"\U0001f44d")'
65535 2 [u'\ud83d', u'\udc4d']
# Wide build
$ python -c 'import sys; print sys.maxunicode, len(u"\U0001f44d"), list(u"\U0001f44d")'
1114111 1 [u'\U0001f44d']
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 对于单个 Unicode 字符串返回长度为 2 的相关文章

随机推荐

  • 如何确定 .Net DLL 是否用于 GUI 应用程序或 Web 服务?

    如何确定 Net DLL 是否在 Windows GUI 应用程序或 Web 服务中运行 我有一个低级类 在两个应用程序之间共享 并且需要在 Web 服务中使用它时禁用消息框 Windows 应用程序有超过 200 个解决方案 我无法重构现
  • 将 !important 应用于具有多个选项的字体系列

    如何将 important 应用于以下样式 font family Trebuchet MS Verdana Helvetica Sans Serif 我已经尝试过这个 但不起作用 font family Trebuchet MS Verd
  • Prolog 程序返回命题公式中的原子

    我是序言新手 正在尝试编写一个返回atoms在一个结构良好的命题公式中 例如查询ats and q imp or p q neg p As 应该返回 p q for As 下面是我的代码 它返回的公式为As 我不知道该怎么做才能拆分sing
  • IIS7 URL从根目录重定向到子目录[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用带有 IIS7 的 Windows Server 2008 我需要重定向访问的用户www mysite com to wwww
  • oracle中的触发器

    触发器可以增强或阻碍性能的条件是什么 何时使用系统中的触发器 何时不使用触发器 如何使用触发器来施加复杂的约束 执行触发器总是会产生一些开销 至少 您要为导致触发器触发的每一行执行从 SQL 引擎到 PL SQL 引擎的上下文转换 虽然触发
  • JavaFX ObservableList - 添加项目导致 ConcurrentModificationException

    我有一张桌子Albums用户可以过滤和排序 这是该表的样子 正如您所看到的 这些列是可排序的 并且顶部有一个文本框 当前正在过滤其中包含字符串 cu 的专辑 一切都很完美填充专辑列表后 但是 如果我在填充专辑列表时尝试排序或过滤 我会得到一
  • c++ 不合逻辑 >= 处理 vector.size() 时的比较很可能是由于 size_type 是无符号的

    在处理 vector size 又名 size type 时 我可以使用一些帮助来澄清这种奇怪的比较 vector
  • 如何更改 jqgrid 中弹出的列选择器中的列名称?

    我有一个两列标题 Phase1 和 Phase 2 图像 1 现在在列选择器窗口中显示列名称 图 2 Name 类别 子类别 类别 子类别 我想以不同的方式展示 Name 一等奖组 一期子类别 Ph2组 Ph2子类别 注意 根据我的要求不要
  • 何时在 Ruby 中使用“self”

    这个方法 def format stations and date from station titelize if from station respond to titleize to station titleize if to st
  • 使用 Windows 身份验证对单个操作而不是整个应用程序进行身份验证

    我想在某个计算机上使用 Windows 集成身份验证进行身份验证单控制器动作而不是全局应用程序 我在网上和StackOverflow上阅读了很多文章 但没有找到答案 请注意 我正在 Web API 2 0 中进行开发 而不是 MVC 也就是
  • XMLHttpRequest 上传带有参数的文件

    我想使用 Safari 5 1 的 XMLHTTRequest 上传文件并在 POST 请求中传递参数 这如何实现 它应该是纯 JavaScript 而不使用任何 API 我这样做是因为 Safari 不支持 5 1 版本中的 FileRe
  • 为什么 Python 异常被命名为“Error”?

    为什么 Python 异常被命名为 Error 例如ZeroDivisionError NameError TypeError 而不是 例外 例如ZeroDivisionException NameException TypeExcepti
  • Google 群组和订阅代码

    我对任何领域的编程都是新手 刚开始我有一个添加订阅按钮的任务 我拥有的 Google 群组邮件列表 一个网站 我没有 Google 应用引擎 要求 非常简单 网站中的订阅按钮可以自动将人们订阅到邮件列表 语言 PHP HTML 不要问我有关
  • ReplaceReducer 导致意外的键错误

    我有一个 React 应用程序 它动态加载模块 包括模块的减速器函数 然后调用 Redux 的replaceReducer 来替换减速器 不幸的是我收到了一个错误 在传递给 createStore 的初始状态参数中发现意外的键 bookEn
  • 如何在 SQLAlchemy 中使用通配符? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 SQLAlchemy 对查询使用通配符 但我得到一个空列表 My code engine create engine os getenv DATABASE URL db scoped sessio
  • 如何使 IconButton 的突出显示颜色显示在父窗口小部件上?

    当我设置包含 IconButton 的容器的颜色时 我发现 IconButton 的突出显示颜色被容器的颜色隐藏了 这就是我的意思 如何保证蓝圈出现above红方块 这是我的代码 import dart ui import package
  • Google 通过图像脚本搜索本地图像[重复]

    这个问题在这里已经有答案了 我正在搜索一个脚本来查找与本地图像相似的图像 实际上 我在 stackoverflow 上搜索过类似的主题 但找不到任何解决方案或线索来解决我的问题 以下网址中的主题与我的问题类似 但它使用文本进行搜索 pyth
  • 更改 Spark 数据框中列的可为空属性

    我正在手动创建一个数据框进行一些测试 创建它的代码是 case class input id Long var1 Int var2 Int var3 Double val inputDF sqlCtx createDataFrame Lis
  • jQuery UI 在下降时平滑过渡

    我正在使用 jQuery UI 卡牌掉落插件创建一个非常简单的配对游戏 我想让卡掉落的捕捉过渡更加平滑 这样当您将正确的卡掉落到正确的插槽上时 它就会稳定地移动到位 她是一个 JSFiddlehttp jsfiddle net AyN2a
  • Python 对于单个 Unicode 字符串返回长度为 2

    在 Python 2 7 中 In 2 utf8 str xf0 x9f x91 x8d In 3 print utf8 str In 4 unicode str utf8 str decode utf 8 In 5 print unico