Python/Django中Unicode与UTF-8的混淆?

Python/Django中Unicode与UTF-8的混淆?,python,django,unicode,Python,Django,Unicode,我无意中读到了这篇文章: Django模型有一个默认的str()方法,该方法调用unicode()并将结果转换为UTF-8 bytestring。这意味着unicode(p)将返回一个unicode字符串,str(p)将返回一个普通字符串,字符编码为UTF-8 现在,我很困惑,因为afaik Unicode不是任何特定的表示,那么Python中的“Unicode字符串”是什么呢?这是否意味着UCS-2?谷歌出现了一个大胆的声明 Unicode是一种双字节编码,它涵盖了世界上所有常见的书写系统 这

我无意中读到了这篇文章:

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

现在,我很困惑,因为afaik Unicode不是任何特定的表示,那么Python中的“Unicode字符串”是什么呢?这是否意味着UCS-2?谷歌出现了一个大胆的声明

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


这显然是错的,还是真的错了?我已经被字符集和编码问题弄糊涂了很多次,但在这里我很确定我正在阅读的文档是混乱的。当Python给我一个“Unicode字符串”时,有人知道Python中发生了什么吗?

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

来自:

UTF-8(8位UCS/Unicode转换格式)是Unicode的可变长度字符编码。它能够表示Unicode标准中的任何字符,但UTF-8的字节码和字符分配的初始编码与ASCII向后兼容。由于这些原因,它正逐渐成为电子邮件、网页[1]和其他存储或传输字符的地方的首选编码。 因此,根据您希望在Unicode领域中表示的字符,它的大小介于1到4个字节之间

在计算领域,Unicode是一种行业标准,允许计算机一致地表示和操作世界上大多数书写系统中表达的文本。 因此,它能够代表世界上大多数(但不是全部)的书写系统

我希望这有帮助:)

那么什么是Unicode字符串呢 蟒蛇


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

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

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编码,这又增加了一个混淆源。Microsoftland的人可能经常复制这种有点误导的习惯。

Python根据平台和编译选项将Unicode字符串存储为UTF-16或UTF-32。str(Unicode_字符串)在什么平台上返回UTF-8?你试过了吗?e、 g.str(u“\u0369”)在两个计数上都错误
str(unicode_val)
将根据
sys.getdefaultencoding()
进行编码。我认为UCS-2和UTF-16之间的差异至少值得注意,因为一个是固定长度的,另一个不是。如果我关心内部表示,我想知道这一点。它真的是UCS-2吗?因为Python可以处理字符>代码> sys .Max UncOdis< /Cord>,只是您可能恰好在中间切片字符。使用UCS-2,如何能够在sys.maxunicode上显示/存储/编码/解码字符?(使用Python 3.1测试)它必须是UTF-16,因为UCS-2不支持代理项对。在Python3.1的狭义构建中,将字符拆分为代理:
list(chr(sys.maxunicode+1))
。结果是
['\ud800','\udc00']
。有人可以在(窄)Python 2上确认吗?是的,Python 2还允许通过
unichr
\U00nnnnnn
字符串文字转义将单个非BMP字符创建为两个代理代码单元。所以从技术上讲,它使用UTF-16和UCS-2语义。不过,我讨厌使用术语“UTF-16”,因为它可能意味着一系列16位代码单元,也可能意味着基于字节的大端或小端编码,这会导致大量混乱。实际上,所有的“UCS-2”实际上都是“UTF-16”,因为后者是前者更常用的超集。在狭窄的Unicode构建中,Python Unicode字符串的长度是UTF-16代码单元的数量,而不是实际的Unicode代码点。截短体