我知道django在整个框架中使用unicode字符串而不是普通的python字符串。普通的python字符串使用什么编码?为什么他们不使用unicode? p>
答案 0 :(得分:29)
在Python 2中:普通字符串(Python 2.x str
)没有编码:它们是原始数据。
在Python 3中:这些被称为“字节”,这是一个准确的描述,因为它们只是字节序列,可以用任何编码进行文本编码(几个是常见的!)或非文本数据。
要表示 text ,您需要unicode字符串,而不是字节字符串。“unicode strings”,我指的是Python 2中的unicode
个实例和{{ Python中的实例3. Unicode字符串是在没有编码的情况下抽象地表示的unicode代码点序列;这非常适合表示文本。
字节串是很重要的,因为要表示通过网络传输或写入文件或其他任何内容的数据,您不能拥有unicode的抽象表示,您需要具体的字节表示。虽然它们通常用于存储和表示文本,但这至少有点顽皮。
由于应通过调用str
将unicode转换为字节并使用encode
将字节转换为unicode,因此整个情况变得复杂,Python将尝试执行此操作这是自动使用全局编码,你可以设置默认ASCII,这是最安全的选择。永远不要依赖于此代码,永远不要将其更改为更灵活的编码 - 在获得字节串时显式解码,如果需要在外部发送字符串则进行编码。
答案 1 :(得分:14)
喂!我想在其他答案中添加一些内容,遗憾的是我还没有足够的代表来做到这一点: - (
FWIW,Mike Graham的帖子相当不错,这可能是你应该首先阅读的内容。
以下是一些评论:
from __future__ import unicode_literals
# -*- coding: utf-8 -*-
。有关更多信息,请参阅PEP 0263。更改源编码会影响Unicode文字(无论其前缀或缺少前缀,如第1点所影响)的解释方式。在Py3k中,默认文件编码为UTF-8。str
,2.x中为unicode
),因为在某些时间点,必须将内容写入内存。理想情况下,这对最终用户来说永远不会显而易见。遗憾的是,没有什么是完美的,你偶尔会遇到这样的问题:特别是如果你在Unicode Base Multilingual Plane之外使用时髦的波浪线。从Python 2.2开始,我们就拥有了所谓的 wide 构建和 narrow 构建;这些名称是指内部用于存储Unicode代码点的类型。宽版本使用UCS-4,它使用4个字节来存储Unicode代码点。 (这意味着UCS-4的代码单元大小为4个字节,或32位。)窄版本使用UCS-2。 UCS-2只有16位,因此不能准确编码所有Unicode代码点(就像UTF-16一样,除了没有代理对)。要检查,请测试sys.maxunicode
的值。如果它是1114111
,那么你有一个广泛的构建(可以正确地表示所有Unicode)。如果它更少,那么,不要担心太多。 BMP(代码点0x0000
到0xFFFF
)涵盖了大多数人的需求。有关详细信息,请参阅PEP 0261。答案 2 :(得分:2)
什么编码是普通的python 字符串使用?
在Python 3.x
中 str
是Unicode。这可能是UTF-16或UTF-32,具体取决于您的Python解释器是使用“窄”还是“宽”Unicode字符构建的。
Windows版本的CPython使用UTF-16。在类Unix系统上,UTF-32往往是首选。
在Python 2.x
中 str
是一个字节字符串类型,如C char
。编码不是由语言定义的,而是您的语言环境的默认编码。或者你从互联网上下载的文件的MIME字符集是什么。或者,如果从struct.pack
这样的函数中获取字符串,则它是二进制数据,并且根本不具有字符编码。
unicode
个字符串相当于3.x中的str
。
他们为什么不使用unicode? p>
因为Python(稍微)早于Unicode。而且因为Guido想要保存3.0的所有主要向后兼容的变化。 3.x 中的字符串默认使用Unicode。
答案 3 :(得分:1)
从Python 3.0开始,默认情况下所有字符串都是unicode,还有字节数据类型(Python documentation)。
所以python开发人员认为使用unicode是一个好主意,它在python 2中不常用,主要是由于向后兼容性。它还具有性能影响。
答案 4 :(得分:1)
Python 2.x字符串是8位,仅此而已。编码可能会有所不同(尽管采用ASCII)。我想原因是历史性的。很少有语言,特别是可以追溯到上个世纪的语言,立即使用unicode。
在Python 3中,所有字符串都是unicode。
答案 5 :(得分:-2)
在Python 3.0之前,字符串编码默认为ascii
,但可以更改。 Unicode字符串文字是u"..."
。这太傻了。