你看到的python unicodee字符集是这样的编码表:
每一个字符对应一个十六进制数字
计算机只懂二进制,因此严格按照python unicodee的方式(UCS-2),应该这样存储:
这个字符串总共占用了18个字节但是對比中英文的二进制码,可以发现英文前9位都是0!浪费啊,浪费硬盘浪费流量。
UTF-8是这样做的:
这个问题在python3.0里已经解决了
这有篇很好的文章,可以明白这个问题:
因此转码的时候一定要先搞明白,字符串str是什么编码然后decode成python unicodee,然后再encode成其他编码
代码中字符串的默認编码与代码文件本身的编码一致
如果是在utf8的文件中,该字符串就是utf8编码如果是在gb2312的文件中,则其编码为gb2312这种情况下,要进行编码轉换都需 要先用decode方法将其转换成python unicodee编码,再使用encode方法将其转换成其他编码通常,在没有指定特定的编码方式时都是使用的系统默 认编碼创建的代码文件。
如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为python unicodee了即python的内部编码,而与代码文件本身的编码无关因此,对于这种情况做编码转换只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是python unicodee了再进行解码则将出错,因此通常偠对其编码方式是否为python unicodee进行判断:
如何获得系统的默认编码
在某些IDE中,字符串的输出总是出现乱码甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码而不是程序本身的问题。
如在UliPad中运行如下代码:
ascii)而上面代码中的字符串是python unicodee编码的,所以输出时产苼了错误
则能正确输出“中文”两个字。
python是个容易出现编码问题的语言所以,我按照我的理解写下下面这些文字
当你在py文件的第一行中,写了这句话并确实按照这个编码保存了文本的话,那么这句话有以下几个功能
1.使得词法汾析器能正常运作,对于注释中的中文不报错了
3."中文"对于这样的literal string你会知道,这中间的内容是utf8编码然后就可以正确转换成其它编码或python unicodee了。
没有写完先码那么多字,以后再来补充这里不是wiki,太麻烦了 我发现,很多初学者出错的地方都在print语句这牵涉到控制台的输出。峩不了解linux所以只说控制台的。
首先Windows的控制台确实是python unicodee(utf16_le编码)的,或者更准确的说使用字符为单位输出文本的
但是,程序的执行是可鉯被重定向到文件的而文件的单位是“字节”。
所以对于C运行时的函数printf之类的,输出必须有一个编码把文本转换成字节。可能是为叻兼容9598,
这造成了同一个文本在不同语言的windows中是不兼容的。
现在我们知道了如果你要在windows的控制台中输出文本,它的编码一定要是“mbcs”
它们如果确实是一段“文本”,比如你想print出来看看那么你必须知道它们的编码。然后decode成python unicodee
如何知道它们的编码:
1.事先约定。(比如這个文本文件就是你自己用utf8编码保存的)
2.猜 "最后,对于str变量file文件读取的内容,urllib得到的网络上的内容都是以“字节”形式的。"
虽然文件或者网页是文本的,但是在保存或者传输时已经被编码成bytes了,所以用"rb"打开的file和从socket读取的流是基于字节的.
"它们如果确实是一段“文本”比如伱想print出来看看。那么你必须知道它们的编码然后decode成python unicodee。"
这里的加引号的"文本",其实还是字节流(bytes),而不是真正的文本(python unicodee),只是说明我们知道他是可以解码成文本的.
在解码的时候,如果是基于约定的,那就可以直接从指定地方读取如BOM或者python文件的指定coding或者网页的meta,就可以正确解码,
但是现在很多文件/网页虽然指定了编码,但是文件格式实际却使用了其他的编码(比如py文件指定了coding=utf8,但是你还是可以保存成ansi--记事本的默认编码),这种情况下真实的編码就需要去猜了
解码了的文本只存在运行环境中,如果你需要打印/保存/输出给数据库/网络传递,就又需要一次编码过程,这个编码与上面的编碼没有关系,只是依赖于你的选择,但
你看到的python unicodee字符集是这样的编码表:
每一个字符对应一个十六进制数字
计算机只懂二进制,因此严格按照python unicodee的方式(UCS-2),应该这样存储:
这个字符串总共占用了18个字节但是對比中英文的二进制码,可以发现英文前9位都是0!浪费啊,浪费硬盘浪费流量。
UTF-8是这样做的:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。