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

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

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

现在,我很困惑,因为afaik 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版本,并且需要在Basic Multilingual Plane之外处理字符,那您将做错事情,但这仍然非常罕见,确实需要额外字符的用户应该编译广泛的版本。

完全错误,还是?

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

由于Windows习惯使用术语“ Unicode”来表示,特别是NT在内部使用的UTF-16LE编码,因此还引起混乱。来自Microsoftland的人们可能经常复制这种有点误导性的习惯。

    公众号
    关注公众号订阅更多技术干货!