我偶然发现了这段话 Django教程:

Django 模型有一个默认值 斯特() 调用的方法 统一码() 并将结果转换为 UTF-8 字节串。这意味着 unicode(p) 将返回 Unicode 字符串,str(p) 将返回普通字符串,其中字符编码为 UTF-8。

现在,我很困惑,因为 Unicode 不是任何特定的表示形式,那么 Python 中的“Unicode 字符串”是什么?这是否意味着UCS-2?谷歌搜索出现了 这个“Python Unicode 教程” 其中大胆地指出

Unicode 是一种两字节编码,涵盖了世界上所有常见的书写系统。

这是完全错误的,或者是吗?我多次被字符集和编码问题所困惑,但在这里我很确定我正在阅读的文档是混乱的。有谁知道Python 给我一个“Unicode 字符串”时发生了什么?

有帮助吗?

解决方案

Python 中的“Unicode 字符串”是什么?这是否意味着UCS-2?

Python 中的 Unicode 字符串在内部存储为 UCS-2(固定长度 16 位表示形式,几乎与 UTF-16 相同)或 UCS-4/UTF-32(固定长度 32 位表示形式)。这是一个编译时选项;在 Windows 上,它始终是 UTF-16,而许多 Linux 发行版为其 Python 版本设置 UTF-32(“宽模式”)。

您通常不应该关心:您将看到 Unicode 代码点作为字符串中的单个元素,并且您不知道它们是存储为两个字节还是四个字节。如果您使用 UTF-16 构建并且需要处理基本多语言平面之外的字符,那么您就会做错,但这仍然非常罕见,真正需要额外字符的用户应该编译宽构建。

完全错误,或者是吗?

是的,这是完全错误的。公平地说,我认为该教程相当古老;如果不是 Unicode 3.1(在基本多语言平面之外引入字符的版本),它可能早于宽 Unicode 字符串。

Windows 习惯使用术语“Unicode”来表示 NT 内部使用的 UTF-16LE 编码,这也是造成混乱的另一个原因。来自微软的人们可能经常复制这种有点误导性的习惯。

其他提示

同时,我做了一个精细的研究来验证Python的内部表示是什么,以及它的局限性。”Python 中 Unicode 的真相》是一篇非常好的文章,直接引用了 Python 开发人员的观点。显然,内部表示是 UCS-2 或 UCS-4,具体取决于编译时开关。所以乔恩,这不是 UTF-16,但你的回答无论如何让我走上了正轨,谢谢。

Python 将 Unicode 存储为 UTF-16。str() 将返回 UTF-16 字符串的 UTF-8 表示形式。

维基百科上关于 UTF-8 的内容:

UTF-8(8 位 UCS/Unicode 转换格式)是一种 Unicode 的可变长度字符编码。它能够表示Unicode标准中的任何字符, ,但 UTF-8 的字节码和字符分配的初始编码与 ASCII 向后兼容。由于这些原因,它逐渐成为电子邮件、网页[1]以及其他存储或流式传输字符的地方的首选编码。

因此,它可以是 1 到 4 个字节之间的任意位置,具体取决于您希望在 Unicode 范围内表示的字符。

来自 Unicode 维基百科:

在计算领域,Unicode 是一种行业标准,允许计算机一致地表示和操作用以下语言表示的文本: 世界上大多数书写系统.

因此它能够代表世界上大多数(但不是全部)的书写系统。

我希望这有帮助 :)

那么Python中的“ Unicode String”是什么?

Python“知道”您的字符串是 Unicode。因此,如果你对其进行正则表达式,它会知道哪个是字符,哪个不是等等,这非常有帮助。如果你执行了 strlen,它也会给出正确的结果。举个例子,如果您对 Hello 进行字符串计数,您将得到 5(即使它是 Unicode)。但是,如果您对外来词进行字符串计数,并且该字符串不是 Unicode 字符串,那么您将得到更大的结果。Pythong 使用 Unicode 字符数据库中的信息来识别 Unicode 字符串中的每个字符。希望有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top