当前位置: 首页 > 面试题库 >

Unicode在Python内部如何表示?

潘宪
2023-03-14
问题内容

Unicode字符串如何在Python的内存中按字面表示?

例如,我可以'abc'内存中可视化为等效的ASCII字节。整数可以认为是2的恭维表示形式。但是u'\u2049',即使UTF-8'\xe2\x81\x89'3个字节长表示,我如何u'\u2049'在内存中可视化原义代码点?

是否有将其存储在内存中的特定方法?Python 2和Python 3是否有区别?


问题答案:

我假设您想了解CPython(标准实现)。Python 2和Python 3.0-3.2对Unicode字符使用UCS2 *或UCS4,这意味着
每个字符 将使用2个字节或4个字节。选择哪个是编译时选项。

\u2049然后根据您系统的本机字节顺序以及是否选择了UCS2或UCS4将其表示为\x49\x20or\x20\x49\x49\x20\x00\x00or\x00\x00\x20\x49或or。Unicode字符串中的ASCII字符仍然每个字符使用2或4个字节。

Python
3.3使用表示字符串中所有字符所需的最紧凑形式,切换到新的内部表示形式。选择1个字节,2个字节或4个字节。ASCII和Latin-1文本每个字符仅使用1个字节,其余BMP字符需要2个字节,之后使用4个字节。

有关这些表示形式的完整介绍,请参阅PEP-393:
灵活字符串表示
形式。

*从技术上讲,UCS-2构建使用UTF-16,因为非BMP字符使用UTF-16替代每个编码为4个字节(2个UTF-16字符)。但是,Python文档仍然将此称为UCS2。

这的确会导致意外行为,例如len()非BMP Unicode字符串上的字符长于所包含的字符数。



 类似资料:
  • 问题内容: 我试图更深入地了解Python的工作方式,并且一直在查看http://docs.python.org/3.3/reference/grammar.html上显示的语法。 我注意到它说您也必须更改parsermodule.c,但说实话,我只是不关注这里发生的事情。 我了解语法是如何阅读该语言的规范,但是…我什至不知道该写的是什么。它看起来几乎像Python,但实际上不是。 我希望更好地了

  • 如何在Falcon中进行“内部重定向”? 我设置静态路由: 而且我想将'/'重定向到'/index.html',但不是作为超文本传输协议3xx,我想在内部进行,这样就浏览器而言,路径仍然是'/'但内容是什么'/静态/index.html'的内容。

  • 问题内容: 我试图了解Java如何在内部存储整数。我知道所有Java基本整数都是带符号的(短符号除外)。这意味着该数字在一个字节中减少了一位。 我的问题是,是否所有整数(正数和负数)都存储为二进制补码,或者仅是负数在二进制补码中? 我看到规格说明了。但是我经常感到困惑。 例如: 编辑 要清楚一点 因此,如果你的答案是 数字存储为二进制补码,则: 这里的混乱再次是符号说的,它们都是负数。可能是我误读

  • 我想在图像中形成任意闭合曲线后,变换外部或内部区域的像素值。我该怎么做?

  • 问题内容: 如何用Python表示等效的枚举? 问题答案: 如PEP 435中所述,将枚举添加到Python 3.4中。它也已在pypi上反向移植到 和。 对于更高级的Enum技术,请尝试aenum库(2.7、3.3+,与作者相同enum34。py2和py3之间的代码并不完全兼容,例如,在python 2中需要)。 要使用enum34,做$ pip install enum34 要使用aenum,

  • 问题内容: 我正在使用Eclipse服务器功能进行热代码部署。使用tomcat作为Web服务器。但是我不确定它是如何工作的。我有自己的理解,它必须如何在内部工作。 我的理解:- 当开发人员更改代码(例如,类Employee)时,Eclipse将在正确的位置(必须是特定的Web /应用服务器,将其称为热部署目录(HDD))放置/发布修改后的已编译类。 。现在将显示Web服务器特定的类加载器。它在HD