普通的python字符串使用什么编码?

时间:2010-08-23 12:33:14

标签: python encoding

我知道django在整个框架中使用unicode字符串而不是普通的python字符串。普通的python字符串使用什么编码?为什么他们不使用unicode?

6 个答案:

答案 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的帖子相当不错,这可能是你应该首先阅读的内容。

以下是一些评论:

  1. 在最近的(2.6+)2.x Pythons中,需要在2.x中使用“u”前缀unicode文字。 from __future__ import unicode_literals
  2. Simialrly,ASCII只是默认的源编码。 Python理解各种编码提示,包括emacs风格的# -*- coding: utf-8 -*-。有关更多信息,请参阅PEP 0263。更改源编码会影响Unicode文字(无论其前缀或缺少前缀,如第1点所影响)的解释方式。在Py3k中,默认文件编码为UTF-8。
  3. Python当然会在内部对Unicode字符串使用编码(py3k中为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(代码点0x00000xFFFF)涵盖了大多数人的需求。有关详细信息,请参阅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这样的函数中获取字符串,则它是二进制数据,并且根本不具有字符编码。

2.x中的

unicode个字符串相当于3.x中的str

  

他们为什么不使用unicode?

因为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"..."。这太傻了。