今天给各位分享精品99卡1卡2卡3乱码的知识,其中也会对三类乱码原因分析进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
编码解码概述我们都知道计算机不能直接存储字母,数字,图片,符号等,计算机能处理和工作的唯一单位是"比特位(bit)",一个比特位通常只有0和1,是(yes)和否(no),真(true)或者假(false)等等我们喜欢的称呼。利用比特位序列来代表字母,数字,图片,符号等,我们就需要一个存储规则,不同的比特序列代表不同的字符,这就是所谓的"编码"。反之,将存储在计算机中的比特位序列(或者叫二进制序列)解析显示出来成对应的字母,数字,图片和符号,称为"解码",如同密码学中的加密和解密,下面将详细解释编码解码过程中涉及到的一些术语:
字符集合(Characterset):是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等,简单理解就是一个字库,与计算机以及编码无关。
字符编码集(Codedcharacterset):是一组字符对应的编码(即数字),为字符集合中的每一个字符给予一个数字,如Unicode为每一个字符分配一个唯一的码点与之一一对应。
字符编码(CharacterEncoding):简单理解就是一个映射关系,将字符集对应的码点映射为一个个二进制序列,从而使得计算机可以存储和处理。常见的编码方式有ASCII编码、ISO-8859-1(不支持中文)、GBK、GB2312(中国编码,支持中文)、UTF-8等等,详情见表1。
字符集(Charset):包括编码字符集和字符编码,如ASCII字符集、ISO-8859-X、GB2312字符集(简中)、BIG5字符集(繁中)、GB18030字符集、Shift-JIS等,即下文中提到的字符集。
表1.常见字符集和对应编码方式
字符集编码说明ASCIIASCII编码ASCII字符集:主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号。
ASCII编码:用一个字节的低7位表示,0~31是控制字符如换行回车删除等;32~126是打印字符;ASCII的最大缺点是只能解决了部份西欧语言的显示问题,但对更多其他语言依然无能为力。ISO-8859系列ISO-8859系列编码ISO-8859-X字符集:扩展的ASCII字符集,包括ISO-8859-1~ISO-8859-15,涵盖了大多数西欧语言字符和希腊语。
ISO-8859-1编码:用8位表示一个字符,总共能表示256个字符,但还是单字节编码,不能对双字节如中日韩等进行编码。GB2312GB2312编码GB2312编码:它的全称是《信息交换用汉字编码字符集基本集》,它是双字节编码,每个汉字及符号以两个字节来表示。第一个字节称为"高位字节"(也称"区字节)",第二个字节称为"低位字节"(也称"位字节")。总的编码范围是A1-F7,其中从A1-A9是符号区,总共包含682个符号,从B0-F7是汉字区,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。GBKGBK编码GBK编码:全称叫《汉字内码扩展规范》,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GB18030GB18030编码GB18030-2005《信息技术中文编码字符集》是我国自主研制的以汉字为主并包含多种我国少数民族文字(如藏、蒙古、傣、彝、朝鲜、维吾尔文等)的超大型中文编码字符集强制性标准,其中收入汉字70000余个,解决了中文、日文、朝鲜语等的编码,兼容GBK。采用变长字节表示即单字节、双字节和四字节三种方式对字符编码。可表示27484个文字Big5Big5编码Big5编码:适用于台湾、香港地区的一个繁体字编码方案。使用了双八码存储方法,以两个字节来安放一个字,第一个字节称为"高位字节",第二个字节称为"低位字节。UnicodeUTF-8UTF-8:采用变长字节(1ASCII,2希腊字母,3汉字,4平面符号)表示,在网络传输中即使错了一个字节,不影响其他字节;存储效率比较高,适用于拉丁字符较多的场合以节省空间,UTF-8没有字节顺序问题,所以UTF-8适合传输和通信。UnicodeUTF-16UTF-16:从先前的固定宽度的16位编码(UCS-2)发展而来的,能够对Unicode的所有1,112,064个有效codepoint进行编码。其编码方式是可变长度的,因为codepoint是用一个或两个16位代码单元编码的。在UTF-16文件的开头,会放置一个U+FEFF字符作为ByteOrderMark(BOM):UTF-16LE(小端序)以FFFE代表,UTF-16BE(大端序)以FEFF代表,以显示这个文字档案是以UTF-16编码。UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节(2字节)储存,但UTF-16却无法兼容于ASCII编码,实际使用也比较少。UnicodeUTF-32UTF-32(或UCS-4):对每一个Unicode码点使用4字节进行编码,其它的Unicode编码方式则使用不定长度编码。就空间而言,UTF-32是非常没有效率的。尤其非基本多文种平面的字符在大部分文件中通常很罕见,以致于它们通常被认为不存在占用空间大小的讨论,使得UTF-32通常会是其它编码的二到四倍。虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。
乱码产生原因概述乱码产生的根源一般情况下可以归结为三方面即:编码引起的乱码、解码引起的乱码以及缺少某种字体库引起的乱码(这种情况需要用户安装对应的字体库)
下面通过几个常见例子,从普通用户角度分别阐述这几种原因导致的乱码表象和解决办法。
编码引起的乱码表象分析
在英文版windows系统(实验使用的是win764位专业版),新建一个txt文件,写上"你好"保存。然后再双击打开,将会看到保存的内容变成了"??",如图4所示
图4.不合适的编码方式引起的乱码
原因分析:Windows默认选用ANSI编码,英文版Windows7默认的系统Locale是English(UnitedStates),对应的codepage为437即编码方式为ISO-8859-1。我们用十六进制查看器可以看到"你好"对应的的十六进制数为"3F3F",这是因为中文和中文符号经过不支持中文的ISO-8859-1编码时,将不在字符集范围内的字符统一用3F表示,3F对应的字符为问号"?",如图5所示。
解决办法:这种情况下形成的乱码是不可逆的,也就是说无论用什么解码方式都不能正确显示字符。我们在保存双字节字符的文档时,选择正确的编码方式,比如简中可以选择GB2312或者UTF-8;繁中字符可以选择BIG5或者UTF-8等;如果安装的是英文操作系统,对于中文用户,可以将系统Locale更改为Chinese(Simplified,PRC)。
图5.编码方式引起的乱码剖析
解码引起的乱码表象分析
在中文版Windows系统创建一个txt文件,写上"你好,中国"然后保存,再将这个txt文件复制到英文版Windows系统,双击打开,将会看到保存的内容变成"??o?£??D1ú"。
原因分析:中文版Windows系统创建的txt文件以默认的ANSI编码即GB2312,当复制到英文版Windows系统时,Notepad默认的解码方式为ISO-8859-1,如图6所示的表象分析。这种情况下产生的乱码是可逆的,只要使用正确的解码方式,就可以正确显示文件中的字符。
解决办法:遇到类似解码问题引起的乱码,可以换一个编辑器打开,同时选择正确的解码方式。
图6.不正确的解码方式引起的乱码
缺少字体引起的乱码表象分析
在英文Windows系统打开一个文件发现里面的内容有些显示为方框。
原因分析:这个例子中显示为方框的都是中文字符。我们看到屏幕上的字符实际上经历了三种不同形态,从二进制字节序列转换成对应字符集中的码点,然后码点通过查找字体库找到对应的字符,最后通过点阵的方式显示在屏幕上。这里的方框是因为所查找的字体库缺少该码点对应的字符,或者根本没有安装该字体库,从而字符库中找不到的字符都以方框代替。
解决办法:安装对应的字体库,比如Windows系统在C:\Windows\Fonts目录下会有安装好的字体库列表。安装字体库比较简单,下载后解压,然后复制到对应系统的Fonts目录下。这里有个问题就是如何知道缺少何种字体?有些阅读器比如Adobe在打开文档时会提示缺少什么字体,但是很多编辑器或者阅读器是不提示的,这个时候可能需要根据经验来判断。
文章到此结束,如果本次分享的精品99卡1卡2卡3乱码和三类乱码原因分析的问题解决了您的问题,那么我们由衷的感到高兴!
还没有评论,来说两句吧...