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

Bun*_*bit 14 python encoding

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

Mik*_*ham 29

在Python 2中:普通字符串(Python 2.x str)没有编码:它们是原始数据.

在Python 3中:这些被称为"字节",这是一个准确的描述,因为它们只是字节序列,可以用任何编码(几个是常见的!)或非文本数据进行文本编码.

要表示文本,您需要unicode字符串,而不是字节字符串."unicode strings"是指unicodePython 2中的str实例和Python 3中的实例.Unicode字符串是在没有编码的情况下抽象地表示的unicode代码点序列; 这非常适合表示文本.

字节串是重要的,因为要表示通过网络传输或写入文件或其他任何内容的数据,您不能拥有unicode的抽象表示,您需要具体的字节表示.虽然它们通常用于存储和表示文本,但这至少有点顽皮.

整个情况很复杂,因为虽然你应该通过调用encode并将字节转换为unicode来将unicode转换为字节decode,但Python会尝试使用全局编码自动执行此操作,您可以设置默认情况下为ASCII,即最安全的选择.永远不要依赖于此代码,永远不要将其更改为更灵活的编码 - 在获得字节串时显式解码,如果需要在外部发送字符串则进行编码.


lvh*_*lvh 14

嘿! 我想在其他答案中添加一些东西,遗憾的是我还没有足够的代表来做到这一点:-(

FWIW,迈克格雷厄姆的帖子非常好,这可能是你应该首先阅读的内容.

以下是一些评论:

  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字符串使用编码(str在py3k中,unicode在2.x中),因为在某些时候,东西必须写入内存.理想情况下,这对最终用户来说永远不会显而易见.不幸的是,没有什么是完美的,你偶尔会遇到这样的问题:特别是如果你在Unicode Base Multilingual Plane之外使用时髦的波浪线.从Python 2.2开始,我们就拥有了所谓的宽版本和窄版本建立; 这些名称是指内部用于存储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.

  • 第二条评论因为我无法将其合二为一.虽然UCS-2和UTF-16*是*不同的东西,但它并不完全清楚Python在内部使用的窄版本.来自Thomas Wouters的引用:01:57 <Yhg1s>好吧,它被称为UCS-2,因为它不会将代理人视为单个角色......但它也是UTF-16,因为它*有*代理人:) - 你看到的行为是后者的结果. (3认同)
  • 咦?维基百科页面说他们*不等同.事实上,它明确指出差异在于它的固定宽度并且不支持代理对(这实际上是两次相同的事情).从那里引用:较旧的UCS-2(2字节通用字符集)标准是类似的字符编码,在Unicode版本2.0中被UTF-16取代,尽管它仍然在使用中.UCS-2是固定长度,始终将字符编码为单个16位代码单元.它不支持代理对,只能编码BMP范围U + 0000到U + FFFF中的字符. (2认同)

dan*_*n04 5

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

在 Python 3.x 中

str是统一码。这可能是 UTF-16 或 UTF-32,具体取决于您的 Python 解释器是使用“窄”还是“宽”Unicode 字符构建的。

Windows 版本的 CPython 使用 UTF-16。在类 Unix 系统上,UTF-32 往往是首选。

在 Python 2.x 中

str是像 C 一样的字节字符串类型char。编码不是由语言定义的,而是由您的语言环境的默认编码决定的。或者无论您从 Internet 上获取的文档的 MIME 字符集是什么。或者,如果您从类似 的函数中获取字符串struct.pack,那么它是二进制数据,并且根本没有有意义的字符编码。

unicodestr2.x 中的字符串与3.x 中的字符串等效。

他们为什么不使用 unicode?

因为 Python(稍微)早于 Unicode。因为 Guido 希望保留 3.0 中所有主要的向后不兼容的更改。3.x 中的字符串默认使用Unicode。

  • 技术上的小挑剔。窄版本使用 UCS-2,而不是 UTF-16。关键区别在于它们无法准确表示将使用 UTF-16 中的代理对进行编码的代码点(即作为单个代码点)。 (2认同)

Mad*_*ist 3

从Python 3.0开始,所有字符串默认都是unicode,还有字节数据类型(Python文档)。

所以Python开发者认为使用unicode是一个好主意,它在Python 2中没有被普遍使用主要是由于向后兼容性。它还具有性能影响。