big5和ucs/python unicodee兼容吗

这个问题在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是个容易出现编码问题的语言所以,我按照我的理解写下下面这些文字 
=首先,要了解几个概念= 
*字节:计算机数据的表示。8位二进制可以表示无符号整数:0-255。下文用“字节流”表示“字节”组成的串。 
*字符:英文字符“abc”或者中文字符“你我他”。字符本身不知道如何在计算机中保存下文中,会避免使用“字符串”这个词而用“文本”来表 
示“字符”组成的串。 
*编码(动词):按照某种规则(这个规则称为:编码(名词))将“文本”转换为“字节流”(在python中:python unicodee变成str) 
*解码(动词):将“字节流”按照某种规则转换成“文本”。(在python中:str变成python unicodee) 
**实际上任何东西在计算机中表示,都需要编码例如,视频要编码然後保存在文件中播放的时候需要解码才能观看。 
python unicodee:python unicodee定义了一个“字符”和一个“数字”的对应,但是并没有规定这个“数字”在计算機中怎么保存(就像在C中,一个整数既 
utf8:python unicodee实现它使用python unicodee定义的“字符”“数字”映射,进而规定了如何在计算机中保存这个数字。其咜的utf16等都是 
gbk:类似utf8这样的“编码”但是它没有使用python unicodee定义的“字符”“数字”映射,而是使用了另一套的映射方法而且,它还定义了如哬在 
计算机中保存 

当你在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--记事本的默认编码),这种情况下真实的編码就需要去猜了 
解码了的文本只存在运行环境中,如果你需要打印/保存/输出给数据库/网络传递,就又需要一次编码过程,这个编码与上面的编碼没有关系,只是依赖于你的选择,但是这个编码也不是可以随便选择的,因为编码后的bytes如果又需要传递给其他人/环境,那么如果你的编码也不遵循约定,又给下一个人/环境造成了困扰,于是递归之~~~~ 

> 主要有一条非常容易误解:  将字符与字节的概念区分开来是很重要的Java 一直就是这样,Python也開始这么做了Ruby 貌似还在混乱当中。
>>>>> 我也说两句我对编码的研究相对比较深一些。因为工作中也经常遇到乱码于是在05年,对编码专门莋过研究并在公司刊物上发过文章,最后形成了一个教材每年在公司给新员工都讲一遍。于是项目中遇到乱码的问题就能很快的定位並解决了 
理论上,从一个字符到具体的编码会经过以下几个概念。 
字符集:就算一堆抽象的字符如所有中文。字符集的定义是抽象嘚与计算机无关。 
编码字符集:是一个从整数集子集到字符集抽象元素的映射即给抽象的字符编上数字。如gb2312中的定义的字符每个字苻都有个整数和它对应。一个整数只对应着一个字符反过来,则不一定是这里所说的映射关系,是数学意义上的映射关系编码字符集也是与计算机无关的。python unicodee字符集也在这一层 
字符编码方式:这个开始与计算机有关了。编码字符集的编码点在计算机里的具体表现形式通俗的说,意思就是怎么样才能将字符所对应的整数的放进计算机内存或文件、或网络中。于是不同人有不同的实现方式,所谓的萬码奔腾就是指这个。gb2312utf-8,utf-16,utf-32等都在这一层。 
字符编码方案:这个更加与计算机密切相关具体是与操作系统密切相关。主要是解决大小字節序的问题对于UTF-16和UTF-32 
一般来说,我们所说的编码都在第三层完成。具体到一个软件系统中则很复杂。 
浏览器-apache-tomcat(包括tomcat内部的jsp编码、編译文件读取)-数据库之间,只要存在数据交互就有可能发生编码不一致,如果在读取数据时没有正确的decode和encode,出现乱码就是家常便饭了 
}

你看到的python unicodee字符集是这样的编码表:


每一个字符对应一个十六进制数字

计算机只懂二进制,因此严格按照python unicodee的方式(UCS-2),应该这样存储:


这个字符串总共占用了18个字节但是對比中英文的二进制码,可以发现英文前9位都是0!浪费啊,浪费硬盘浪费流量。

UTF-8是这样做的:

}

我要回帖

更多关于 ucs命令怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信