【发布时间】:2014-03-13 11:05:00
【问题描述】:
在 Python >= 3.3 中,为了帮助解决 Unicode 编码和解码问题,我希望能够从 Python 代码中检查存储在字符串中的实际内部数据。我该怎么做?
有一个 str.encode() 方法,它返回一个字节表示,但通常这是一个由特定编解码器翻译的字节序列(由“编码”参数选择),而不是存储在str 对象。
有一个“unicode_internal”编码选项,但它已被弃用,并且不清楚在 3.3 中它是否返回真实的内部数据(如何组织?),或者它的一些翻译。
PEP 393 描述了 Unicode 数据的内部结构,从中看来,从 Python 访问它需要报告字符串类型(1/2/4 字节)、表示(ASCII/紧凑)以及字节数组包含字符串内容,(我认为其格式为 ASCII、UCS1、2 或 4)。
我还没有找到在 Python 中提供这种访问的 str 类型的方法。
还有其他方法吗?也许是使用结构的聪明方法?还是公开这些字符串内部结构的 C 库?
2014 年 3 月 13 日更新:
感谢所有回复了关于为什么不应该访问字符串内部结构的建议的人。对于普通的 Python 程序,这当然是有效的建议。
不过,我的问题是:怎么做?
扩展基本原理:这是为了解决编码-解码问题,其中一个函数(可能在某个库中)创建并返回一个 str,而另一个函数(可能在某个其他库中)应该做某事与那个海峡。
我想检查该中间 str 的确切内容,(即:我想将问题空间分成两半),并且这样做不引入另一个变量,即让一个或另一个 python 函数将该数据转换为一些其他形式(如带有转义序列的 ASCII)。
除其他原因外,我想知道确切的内部数据,以防其中一个库实际上对内部数据格式敏感。所述库很可能是用 C 编写的,可以访问该数据,但处理不正确。
此外,确实应该将 str 视为一系列代码点,而无需关注内部内部表示。但是,如果字符串处理中确实存在错误,我不想被它误导,如果没有,我希望有信心没有。考虑到字符串库的复杂性,零错误将是一项了不起的成就。
那么:如何检查字符串的内部结构?
【问题讨论】:
-
内部表示如何帮助您解决编码或解码问题?在尝试确定内容时,我会坚持使用
ascii()。 -
除非您正在编写需要处理
str类型内部的C 扩展,否则绝对不需要处理内部C 结构。这就像试图处理dict类型的内部哈希表;它与 Python 代码的编码或解码问题无关。 -
无论是否编码,您都在寻找通过编码对字节的特定解释。如果我没记错的话,我不久前看到 Python 的 unicode 在内部存储为 UTF-16。我会检查这个。但顺便提一下,即使是 Unicode 也需要一种将自身存储在内存中的方法,最终将其转换为特定编码的字节。
-
@PauloBu:Python 3.3 and up will use Latin-1, UCS-2 or UCS-4,根据字符串的实际内容,安全内存。但是,这对于 Python 代码是完全透明的,并且与您尝试将此类值编码为字节时发生的情况无关。
-
@PauloBu:UCS-2 和 UTF-16 是不同的编码。它们之间的混淆已经给程序员带来了很多痛苦。
标签: python string unicode python-3.3