Python3.3:访问字符串内部表示?

2024-09-26 18:02:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python>;=3.3中,为了帮助解决Unicode编码和解码问题,我希望能够从Python代码中检查存储在字符串中的实际内部数据。我该怎么做?在

有一个结构编码()方法,它返回字节表示形式,但通常这是由特定编解码器(由“encoding”参数选择)翻译的字节序列,而不是存储在str对象中的实际原始字节。在

有一个“unicode_internal”编码选项,但它已被弃用,而且不清楚在3.3中,它是否返回真正的内部数据(如何组织?)或是它的一些翻译。在

pep393描述了Unicode数据的内部结构,从中可以看出,从Python访问这些数据需要报告字符串类型(1/2/4字节)、表示(ASCII/compact)以及包含字符串内容的字节数组(我认为其格式是ASCII、UCS1、2或4)。在

我在Python中找不到str类型上提供这种访问的方法。在

还有别的办法吗?也许是使用struct的聪明方法?或者一个公开这些字符串内部结构的C库?在

更新2014-03-13:

感谢所有的人,他们给出了为什么不应该访问字符串的内部结构的建议。对于一个普通的Python程序来说,这无疑是一个有效的建议。在

尽管如此,我的问题是:怎么做?在

扩展基本原理:这是为了解决编解码问题,其中一个函数(可能在某个库中)创建并返回str,而另一个函数(可能在其他库中)应该对该str执行某些操作

我想检查中间str的确切内容,(即:我想把问题空间一分为二),并且在不引入其他变量的情况下,让一个或另一个python函数将数据转换成其他形式(比如ASCII和转义序列)。在

除其他原因外,我想知道确切的内部数据,以防另一个库实际上对内部数据格式敏感。所说的库很可能是用C编写的,可以访问这些数据,并且处理错误。在

同样,事实上,str应该是可以作为一系列代码点来处理的,而内部表示并不重要。但是如果字符串处理中真的有一个bug,我不想被它误导,如果没有的话,我希望没有错误。考虑到字符串库的复杂性,零bug将是一个相当大的成就。在

那么:我该如何检查弦的内部结构呢?在


Tags: 数据方法函数字符串代码类型内容编码
2条回答

将unicode值introduced by PEP-393的内部转换为更节省空间的存储是出于性能原因。在

因此,它们对Python代码中unicodestr值的编码和解码方式没有任何影响。从Python访问内部表示绝对没有意义。字符A存储为414100或{},这取决于字符串中最高码位所需的空间大小,但它仍将以ASCII、Latin-1或UTF-8编码为41。在

除非您正在编写一个必须处理这种内部表示的C扩展,否则完全不必担心Python实际上是如何存储数据的。在

为了调试编码或解码问题,我将使用^{} function来表示仅使用ASCII码位和Python字符串文本转义符的字符串,或者您可以使用^{} function将单个字符转换为每个代码点的整数。在

对于字节值,^{} function还可以方便地将一系列字节快速转换为十六进制表示。在

Python中的Unicode字符串应该被视为Unicode代码点的序列。如何在内部表示这一点对于编码和解码问题完全不重要。在

您可以通过对字符串的各个字符使用ord()函数来访问Unicode代码点的数值:

>>> list(map(ord, "abc €"))
[97, 98, 99, 32, 8364]

我不认为这对调试编码问题(或其他任何问题)特别有帮助,但它可能会澄清Unicode字符串的概念。在

相关问题 更多 >

    热门问题