1

在Django Web 框架的教程页面__unicode__()上,作者解释了为什么添加方法比添加方法更受欢迎__str__(),原因如下:

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

我不明白 Unicode 字符串和字符编码为 UTF-8 的字符串之间有什么区别。我认为 UTF-8 是 Unicode 的编码之一?

4

4 回答 4

3

Python Unicode 对象是抽象的——它们表示独立于任何特定编码的 Unicode 代码点序列。另一方面,UTF-8 编码的字符串是对 Unicode 代码点序列进行编码的字节序列。它们是不同层次的抽象。

您可以将代码点视为抽象数字,将编码视为该数字的特定二进制表示。Unicode 对象代表“数字”(实际上是代码点),而字符串代表二进制。这个类比并不准确,但如果您已经习惯了这样一种想法,即表示整数“8”的对象与表示特定位序列“00001000”的对象不同,它可能会证明是澄清的。特别是如果您使用过二进制补码等系统,其中表示抽象整数“8”的位序列会有所不同。

这篇文章虽然距今已有近十年的历史,但仍然是我遇到过的对这些概念最清晰、最全面的解释之一。

这个答案在 Python 特定的细节上非常好。

于 2013-08-01T04:14:49.837 回答
0

UTF-8 是整个 Unicode 字符集的编码。它向后兼容 ASCII。对于 ASCII 集之外的字符,使用多字节编码。

所有 ASCII 字符串都是 Unicode 字符串。所有 Unicode 字符串都不是 ASCII 字符串。

于 2013-08-01T04:06:17.363 回答
0

在 Python 中,Unicode 字符串在内部存储为 UCS-2 或 UCS-4/UTF-32,它们分别是 16/32 位固定长度类型。另一方面,UTF-8 是一种可变长度的位类型,从(填充的)8 位开始,对于超过基本 ASCII 表的代码点,上升到 32 位(31 个使用位)。

于 2013-08-01T04:07:05.217 回答
0

您可能想深入了解 Unicode 文档的海洋。

http://www.utf-8.com/

您会发现 UTF-8 是新的 Unicode。

于 2013-08-01T04:09:52.203 回答