我正在研究学习蟒蛇。它有一个很好的章节来处理python中的unicode字符串。
我只需要澄清我是否正确理解了它。这就是我所理解的。
我发现python 2.x
有str
,它支持普通文本和字节,它有u'...'
文本或unicode()
,用于特殊文本,如unicode字符。
另一方面,python 3.x
具有支持unicode文本的str
,因为所有普通文本都是unicode。
记住这一点,如果您像s = 'something'
一样编写,那么s
既是普通文本,也是python 2.x
中的字节和python 3.x
中的unicode文本的组合。
现在我还读到,文件编码过高,为了在磁盘中保存一些东西,我们需要数字,并且为了存储广泛的字符,我们需要一些编码技术。
这就是我们所拥有的
在python 3.x
中,所有带单引号、双引号和三引号的字符串都以特定的转换格式进行编码和解码,并存储在内存中(用于python解释器)。
另一方面,为了在磁盘上存储文件内容,操作系统遵循某种编码技术来存储不同范围的字符。因此,当我们在文件上编写代码以获得特定的代码点,以便它可以将该代码点保存在内存中时,以及当我们从存储在内存中的文件中提取信息时,通过使用与我们之前使用的完全相同的编码技术,将这些代码点解码为字符。
文件内容以代码点的形式存储在磁盘中,但是当我们在文本编辑器中打开一个文件时,我们看到这些代码点的解码格式是字符形式的。
差不多就是这样。这些都是我所理解的正确吗?此外,我愿意接受任何其他关于unicode的信息,如果你有。
发布于 2015-12-28 21:57:03
您可以阅读Unicode howtos:
简而言之:
这两个Python版本都具有字节数据类型和文本数据类型
# python 2 (without from future import ...):
bytes = "abcd"
text = u"abcd"
# python 3:
bytes = b"abcd"
text = "abcd"
没有像普通文本和Unicode文本那样的东西。只是发短信。对于文本,应始终使用Unicode字符串;对于二进制数据,应始终使用字节。
文件存储字节
文件始终是一个字节序列。如果您以文本形式打开文件,Python 3将执行解码。因此,您通常必须指定使用哪种编码:open('file.txt', encoding='utf-8')
。例如,在Python2中用io.open
做同样的事情是个好主意。
Python源文件包含Unicode文本
对于Python 3,这是规范的一部分:请参阅2. Lexical analysis
Unicode将程序文本读取为
代码点。
但在磁盘上,文件只是字节。同样,Python会将这些字节解码为Unicode文本。要确保Python使用正确的编码,必须声明所使用的编码不同于默认编码(对于Python 2使用ASCII,对于Python 3使用UTF-8 )。
这也告诉您Python如何处理Unicode字符串文字。源代码是一系列Unicode代码点,因此字符串由引号之间的代码点组成。
另一方面,字节文字应该只包含ASCII字符,这些字符映射在字节0-127上。对其他字节使用\x
转义。使用其他字符可能会引发SyntaxError。
ASCIIPython2ASCIIOnly指定字符串文字(和注释)可以使用之外的另一种编码。但是,如果您遵循上面的约定,您将在byte和unicode字符串中获得预期的字节和代码点。
…但是文件不存储字节吗?
当然可以。包含Unicode字符序列的文件的概念是abstraction.。这种抽象是leaky的一种方式是需要声明一种编码,该编码指定磁盘上Unicode字符和字节序列之间的映射。文本编辑器必须使用相同的编码来保存源代码。
另一件事是,Python规范并没有准确地将Python源文件定义为由编码的Unicode文本组成。但它是以这样一种方式指定的:在实践中,源文件几乎总是这样的文本文件。这样做的一个后果就是不像eg。JSON,您不能将Python源文件编码为UTF-16。
但除此之外,这种抽象工作得很好。您可以在文本编辑器中键入(或粘贴) Unicode字符,Python中的字符串将包含正确的字符。
test.py
print(unicodedata.name("⛄"))
print(unicodedata.name(""))
print("⛄ ") # this line may not work on your platform
输出:
SNOWMAN WITHOUT SNOW
FACE WITH TEARS OF JOY
⛄
(仅当Python知道如何将Unicode打印到平台上的控制台时,才能直接打印字符。在Linux上,它很有可能会正常工作)
在内部,您的文本编辑器将雪人转换为字节,例如。0xe2, 0x9b, 0x84
和Python解释器将再次解码这些字节。但是,一旦您使用正确的编码设置了编辑器,这个过程就会隐藏起来,您只能使用Unicode字符。
https://stackoverflow.com/questions/34494635
复制相似问题