python 中文unicode编码,python输出字符的unicode,Unicode和Python的中文处理
Uincode字符串处理一直是Python中一个令人困惑的问题许多Python爱好者经常被Unicode、UTF-8和许多其他代码之间的混淆所困扰本文将介绍Unicode和Python中文处理的相关知识下面就让我们跟随边肖一起来看看吧
Uincode字符串处理一直是Python中一个令人困惑的问题许多Python爱好者经常被Unicode、UTF-8和许多其他代码之间的混淆所困扰我曾经也是这个“伤脑筋的群体”中的一员,但是经过半年多的努力,我终于想通了其中的一些关系现整理如下,与各位同仁共勉同时也希望这篇短文能吸引更多真正的专家加入进来,共同改善我们的Python中文环境
文中提到的观点,有些是通过查阅资料得出的,有些是作者利用现有的各种编码资料“猜测验证”得出的我只要求自己一点点,我怕这里面有很多错误你们当中不乏专家如果有人发现有什么不对的地方,请随时给我提意见作者自己的耻辱是小的,他的错误观点对别人来说是大的错误,你不用担心作者的面子
第一节 文字编码和Unicode标准
要解释Unicode字符串,必须从什么是Unicode编码说起众所周知,文字显示一直是计算机显示功能必须解决的基本问题然而,计算机不能阅读实际上,它把文本看成是一串“图片”,每个“图片”对应一个字符每个计算机程序在显示文本时,都必须使用一个记录“图片”这个词是如何显示的“图片”集合,从中找到“图片”对应的每个字符的数据,并根据例子在屏幕上“画”出这个词这个“图”叫做“字体”,记录字体显示数据的集合叫做“字符集”为了方便程序查找,每个字符的字体数据在字符集中必须是有序的,每个字符都会被赋予一个唯一的ID,也就是该字符的代码计算机在处理字符数据时,总是用这个代码来表示它所代表的字符因此,字符集指定了计算机可以处理的一组字符数据很明显,不同国家规定的字符集大小不同,对应的字符编码也不同
在计算机历史上,使用最广泛的标准化字符集是ASCII字符集它实际上是美国制定的标准,是为北美用户开发的它使用7个二进制位代码,可以表示128个字符该字符集最终被ISO正式采用为国际标准,并广泛应用于各种计算机系统中现在所有PC的BIOS都含有ASCII字符集的字符,可见人心
但是,当计算机在各国广泛使用的时候,ASCII编码的局限性就暴露出来了:它的字符空间确实有限,容纳不下更多的字符,但是大多数语言都需要128个字符以上为了正确处理原生字符,各国官方或民间组织纷纷开始设计自己的字符编码,最终出现了许多针对原生字符的字符编码,如西欧字符的ISO-8859-1编码、简体中文的GB系列编码、日文的SHIFT-JIS编码等等同时,为了保证每一个新的字符集都能兼容原来的ASCII文本,大多数字符集都不变地使用ASCII字符作为其前128个字符,并使其代码与ASCII代码一一对应
这样就解决了各国文字显示的问题,但是带来了一个新的问题:乱码不同国家和地区使用的字符集通常受到没有统一规范的限制,因此每个字符集的代码往往互不兼容同一单词在两个不同的字符集中的编码一般是不同的;并且同一编码在不同字符集对应的字符也不同用代码A写的一段文字,在只支持代码b的系统上往往显示成一堆乱七八糟的字符,更糟糕的是,不同字符集使用的编码长度往往不一样当只能处理单字节编码的程序遇到双字节甚至多字节编码的文本时,往往会因为无法正确处理而出现臭名昭著的“半字”问题这让本已混乱的局面更加混乱
为了一劳永逸的解决这些问题,业界很多大公司和组织联合提出了一个标准,就是UnicodeUnicode实际上是一种新的字符编码系统它用一个双字节的ID号对字符集中的每个字符进行编码,从而定义了一个最多可容纳65536个字符的编码空间,并收集了当前国际编码中所有常用的单词由于在编码设计上考虑周全,Unicode解决了其他字符集数据交换中的乱码和“半字”问题同时,Unicode的设计者充分考虑到大量字体数据仍被各国编码的现实,提出了“以Unicode为内码”的设计理念也就是说,字符显示程序仍然使用原码和代码,而应用程序的内部逻辑将使用Unicode当要显示文本时,程序总是将Unicode编码的字符串转换成原始的显示编码这样,您就不必为了使用Unicode而重新设计字体数据系统同时,为了与各国已经制定的编码相区别,Unicode的设计者将Unicode称为“宽字符编码”,而各国制定的编码习惯上称为“multi bypes编码”如今,Unicode系统已经引入了四字节扩展编码,并逐渐与UCS-4即ISO10646编码标准融合,希望有一天可以用ISO10646系统来统一世界上所有的字码
Unicode系统一诞生,就被寄予厚望,并很快被ISO认可为国际标准但Unicode在推广过程中遭到了欧美用户的反对他们反对的理由很简单:欧美用户使用的原代码都是单字节长,双字节Unicode处理引擎无法处理原单字节数据;但是,如果要把现有的单字节文本全部转换成Unicode,工作量会太大此外,如果将所有单字节编码文本转换为双字节Unicode代码,其所有文本数据将占用两倍于原始空间,所有处理程序都必须重写这笔费用对他们来说是无法接受的
虽然Unicode是国际公认的标准,但ISO不可能不考虑欧美最大的计算机用户的要求于是,在各方协商下,一个Unicode的变体版本应运而生,这就是UTF-8UTF-8是一种多字节编码系统,其编码规则如下:
1、UTF-8编码分为四个区:
一区为单字节编码,
编码格式为:0xxxxx
xx;
Unicode:0x0000-0x007f
二区为双字节编码,
编码格式为:110
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。