34

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

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

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

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

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

4

5 回答 5

52

什么是 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 字符串,如果不是 Unicode 3.1(在基本多语言平面之外引入字符的版本)。

Windows 习惯使用术语“Unicode”来表示 NT 内部使用的 UTF-16LE 编码,还有一个额外的混淆来源。来自 Microsoftland 的人可能经常会复制这种具有误导性的习惯。

于 2009-02-07T00:54:09.373 回答
9

同时,我做了一个精细的研究来验证 Python 的内部表示是什么,以及它的限制是什么。“ The Truth About Unicode In Python ” 是一篇非常好的文章,直接来自 Python 开发人员。显然,内部表示是 UCS-2 或 UCS-4,具体取决于编译时开关。所以乔恩,它不是 UTF-16,但你的回答让我走上了正轨,谢谢。

于 2008-08-22T12:32:59.170 回答
0

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

于 2008-08-22T12:03:47.807 回答
-1

来自UTF-8 的维基百科

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

因此,它介于 1 到 4 个字节之间,具体取决于您希望在 Unicode 领域内表示的字符。

来自关于 Unicode 的维基百科:

在计算中,Unicode 是一种行业标准,允许计算机一致地表示和操作世界上大多数书写系统中表达的文本。

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

我希望这有帮助 :)

于 2008-08-22T12:10:14.077 回答
-2

那么 Python 中的“Unicode 字符串”是什么?

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

于 2008-08-22T12:32:04.383 回答