在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将是一个相当大的成就。在
那么:我该如何检查弦的内部结构呢?在
将unicode值introduced by PEP-393的内部转换为更节省空间的存储是出于性能原因。在
因此,它们对Python代码中unicode},这取决于字符串中最高码位所需的空间大小,但它仍将以ASCII、Latin-1或UTF-8编码为
str
值的编码和解码方式没有任何影响。从Python访问内部表示绝对没有意义。字符A
存储为41
、4100
或{41
。在除非您正在编写一个必须处理这种内部表示的C扩展,否则完全不必担心Python实际上是如何存储数据的。在
为了调试编码或解码问题,我将使用^{} function 来表示仅使用ASCII码位和Python字符串文本转义符的字符串,或者您可以使用^{} function 将单个字符转换为每个代码点的整数。在
对于字节值,^{} function 还可以方便地将一系列字节快速转换为十六进制表示。在
Python中的Unicode字符串应该被视为Unicode代码点的序列。如何在内部表示这一点对于编码和解码问题完全不重要。在
您可以通过对字符串的各个字符使用
ord()
函数来访问Unicode代码点的数值:我不认为这对调试编码问题(或其他任何问题)特别有帮助,但它可能会澄清Unicode字符串的概念。在
相关问题 更多 >
编程相关推荐