试图用vim理解Python2.7中的编码/解码/unicode业务。
我有一个unicode字符串us,我给它分配了一些unicode字符串u‘。
问题1
us是如何在内存中表示的?unicode代码点\u应该由32位长的it组成吗?还是将其作为8位长十六进制值的序列保存在内存中?
问题2
我看到了为unicode字符串us设置编码的四种不同方法:#1在test.py文件的开头;#2作为编码函数的参数;#3作为vim的参数;#4作为文件系统的本地编码。那么,这四个编码(#1,#2,#3,#4)做什么呢?
$ vim test.py
_____________
#encoding: #1
us=u'é'
print us.encode(encoding='#2')
_____________
:set encoding=#3
$ locale | grep LANG
LANG=en_US.#4
LANGUAGE=
发布于 2017-10-23 20:38:22
在Python2.x中,unicode
被编码为UCS-2或UCS-4,这取决于构建它时使用的选项。
us
编码为字节的编码。发布于 2017-10-23 21:08:45
问题1-储存
us = u'é'
这将创建一个Unicode字符,其值为é-在Python中,Unicode字符存储在UCS-2或UCS-4中,它们使用2或4字节长的无符号整数,这取决于构建时间选项。Python 3.3+使用UTF-8,它对每个字符使用1到4个字节,这取决于它所处的范围。
Unicode字符串的存储现在取决于字符串中最高的代码点:
问题2-编码
us=u'é'
声明我们是存储在上面的Unicode字符串,请注意,在python 3中,默认情况下所有字符串都是Unicode,因此可以省略u
。
print(us.encode('ascii', strict)) # encoding='#2')
告诉print如何尝试转换Unicode字符串以便输出,请注意,如果您使用的是Python和一个支持Unicode的终端/控制台,那么您可能不需要使用它。
#set encoding=#3
告诉vim、emacs和一些编辑器在显示&/或编辑文件时使用的编码方法适用于所有文本文件,而不仅仅是python。
$ locale | grep LANG
LANG=en_US.#4
是地区语言的操作系统设置,它告诉它如何具体显示在显示扩展ASCII时要使用的代码页。
发布于 2017-10-25 17:33:34
这实际上并没有回答这个问题,但我希望它能让我们对这个问题有更深入的了解。
对问题1的回答:对于程序员来说,在Python内部如何表示Unicode字符串并不重要。
关于问题2:
程序员应该关心的是,数据接收器和源编码需求是已知的,并且是正确指定的。我假设Python可以通过读取BOM来正确地解释UTF编码的文件,甚至可以通过有知识的猜测来解释,但是如果没有BOM,那么如何处理具有高位集的字节可能是模棱两可的,所以如果您不确定,最好确保BOM在那里,或者告诉Python该文件是UTF-8编码的。
"Unicode“和"UTF”之间的区别似乎被掩盖在上面;"UTF“指定了存储(磁盘、内存、网络数据包)中的表示形式,但是"Unicode”只是一个事实,即每个字符都有一个值(代码点),范围从0到0x10FFFF。各种类型的UTF将该值编码到适当的存储中。但是,使用编码的字符串可能会很烦人(因为字符宽度是可变的),因此当字符串在内存中实际表示时,更容易将它们扩展为某种允许轻松操作的格式。(在对另一个答复的评论中提到了这一点。)
如果您想在PythonPre-3中使用Unicode字符串,只需键入u'<whatever>'
和3+类型'<whatever>'
。您将得到Unicode,如果直接输入字符是不可行的,则可以使用\uXXXX
和\UXXXXXXXX
转义。当您想要写入数据时,请指定编码。UTF-8往往是最容易处理,似乎是最常用的,但你可能有理由使用UTF-16的味道。
这里需要注意的是,编码只是一种转换Unicode数据的方法,以便能够持久化。UTF的各种风格只是编码,它们实际上不是Unicode。
https://stackoverflow.com/questions/46902239
复制