我知道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,迈克格雷厄姆的帖子非常好,这可能是你应该首先阅读的内容.
以下是一些评论:
from __future__ import unicode_literals# -*- coding: utf-8 -*-.有关更多信息,请参阅PEP 0263.更改源编码会影响Unicode文字(无论其前缀或缺少前缀,如第1点所影响)的解释方式.在Py3k中,默认文件编码是UTF-8.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.普通的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。
| 归档时间: |
|
| 查看次数: |
13970 次 |
| 最近记录: |