为什么需要字符集
计算机存储的和认识的东西就是0和1,我们存储的任何东西最后都会转为0和1的组合计算机才能处理,更贴切的说是我们看到的英文、中文等都是0和1组合的二进制经过一定规则转换为我们认识的字符,这个规则就是字符集。
有哪些字符集
ANSI
最早字符集是ANSI编码(American Standard Code for Information Interchange,美国信息互换标准代码),美国人把所有的小写字母、大写字母、空格、符号都从33开始编码,一直编到127,0-32用作特殊用途,这样一个用一个字节的低7位就可以表示这些符号,能够完美显示英文了。
但后来发现其他国家有些文字、符号无法显示,后来又把最高位也用上了,扩展了ANSI表,加入了更多的特殊符号,从127扩展到了255
GB2312、GBK、GB18030
歪果仁看似已经很完美了,这总够了吧!!
但到了中国,中国人一看,够个球啊,堂堂大中国有8万左右,这255个差远了。
于是中国人发明了自己的字符集GB2312,由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是GB2312—1980。它是计算机可以识别的编码,适用于汉字处理、汉字通信等系统之间的信息交换。GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。
于是国人就自主研发,把那些127号之后的奇异符号们直接取消掉。规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。
但是对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
GBK不再要求低字节一定是127号之后的码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是 扩展字符集里的内容。
国家标准GB18030-2000《信息交换用汉字编码
字符集基本集的补充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是我国
计算机系统必须遵循的基础性标准之一。GB18030-2000编码标准是由
信息产业部和
国家质量技术监督局在2000年 3月17日联合发布的,并且将作为一项国家标准在2001年的1月正式强制执行。GB18030-2005《
信息技术中文编码
字符集》是我国自主研制的以汉字为主并包含多种我国少数民族文字(如藏、
蒙古、傣、彝、
朝鲜、
维吾尔文等)的超大型中文编码
字符集
强制性标准,其中收入汉字70000余个。
以上编码都兼容现有ANSI码(不包括扩展码),不然中国人用GBK,美国人用ANSI,中国人看美国人的东西还必须得转回ANSI编码,全乱套了!
UNICODE
因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码。当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,装错了字符系统,显示就会乱了套。这怎么办?就在这时,一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。
UNICODE 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于 ascii 里的那些”半角”字符,UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高 8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。
但是,UNICODE 在制订时没有考虑与任何一种现有的编码方案保持兼容,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。
注意这里的unicode其实只是定义了所有字符的1-65536的表示,还没有考虑具体计算机怎么存储怎么解析的问题。
UTF-8、UTF-16
于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8 就是每次8个位传输数据,而 UTF16 就是每次16个位,只不过为了传输时的可靠性,从UNICODE到 UTF时并不是直接的对应,而是要过一些算法和规则来转换。
用UTF-16表示"汉"
假如用UTF-16表示的话就是01101100 01001001(共16 bit,两个字节).程序解析的时候知道是UTF-16就把两个字节当成一个单元来解析.这个很简单.
用UTF-8表示"汉"
用UTF-8就有复杂点.因为此时程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit标志来识别是该把1个还是两个或三个字节做为一个单元来处理
.0xxxxxxx,如果是这样的01串,也就是以0开头后面是啥就不用管了XX代表任意bit.就表示把一个字节做为一个单元.就跟ASCII完全一样.
110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个单元
1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个单元.
这是约定的规则.你用UTF-8来表示时必须遵守这样的规则.我们知道UTF-16不需要用啥字符来做标志,所以两字节也就是2的16次能表示65536个字符.而UTF-8由于里面有额外的标志信息,所有一个字节只能表示2的7次方128个字符,两个字节只能表示2的11次方2048个字符.而三个字节能表示2的16次方,65536个字符.由于"汉"的编码27721大于2048了所有两个字节还不够,只能用三个字节来表示.所有要用1110xxxx 10xxxxxx 10xxxxxx这种格式.把27721对应的二进制从左到右填充XXX符号(实际上不一定从左到右,也可以从右到左)。
根据填充方式不一样又分为了Big-Endian和Little-Endian,Big-Endian就是从左到右,Little-Endian是从右到左.由上面我们可以看出UTF-8需要判断每个字节中的开头标志信息,所以如果一当某个字节在传送过程中出错了,就会导致后面的字节也会解析出错.而UTF-16不会判断开头标志,即使错也只会错一个字符,所以容错能力强.
UTF-32
前面说的都是unicode的第一个版本.但65536显然不算太多的数字,用它来表示常用的字符是没一点问题.足够了,但如果加上很多特殊的就也不够了.于是从1996年开始又来了第二个版本.用四个字节表示所有字符.这样就出现了UTF-8,UTF16,UTF-32.原理和之前肯定是完全一样的,UTF-32就是把所有的字符都用32bit也就是4个字节来表示.然后UTF-8,UTF-16就视情况而定了.UTF-8可以选择1至8个字节中的任一个来表示.而UTF-16只能是选两字节或四字节..由于unicode版本2的原理完全是一样的,就不多说了.
为什么普遍采用UTF-8,优势在哪里?
首先UTF-8是unicode的实现,适应全球所有字符。
其次UTF-8是变长的,可以根据字符不同用1-3个字节,unicode2是1-8个字节来存储相对utf-16、utf-32节省存储空间
关于记事本无法单独保存“联通”的问题(转载)
当你新建一个 文本文档 之后,在里面输入 “联通” 两个字,然后保存。当你再次打开的时候,原来输入的 “联通” 会变成两个乱码。
这个问题就是因为 GB2312 编码与 UTF8 编码产生了编码冲撞造成的。从网上引来一段从UNICODE到UTF8的转换规则:
UTF-8
0000 – 007F
0xxxxxxx
0080 – 07FF
110xxxxx 10xxxxxx
0800 – FFFF
1110xxxx 10xxxxxx 10xxxxxx
例如”汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。
而当你新建一个文本文件时,记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,”联通”的内码是:
c1 1100 0001
aa 1010 1010
cd 1100 1101
a8 1010 1000
注意到了吗?第一二个字节、第三四个字节的起始部分的都是”110″和”10″,正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本 时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了”00001 101010″,再把各位对齐,补上前导的0,就得到了”0000 0000 0110 1010″,不好意思,这是UNICODE的006A,也就是小写的字母”j”,而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就 是只有”联通”两个字的文件没有办法在记事本里正常显示的原因。
由这个问题,可以发散出很多问题。比较常见的一个问题就是:我已经把文件保存成了 XX 编码,为什么每次打开,还是原来的 YY 编码?!原因就在于此,你虽然保存成了 XX 编码,但是系统识别的时候,却误识别为了 YY 编码,所以还是显示为 YY 编码。为了避免这个问题,微软公司弄出了一个叫 BOM 头的东西。
关于文件 BOM 头的问题
当使用类似 WINDOWS 自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。这样就可以避免这个问题了。对于一般的文件,这样并不会产生什么麻烦。
判断文本采用的哪种UTF
知道具体是哪种编码方式,可以看文本开头(BOM),下面是所有编码对应的开头标志
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
其中的UCS就是前面说的ISO制定的标准,和Unicode是完全一样的,只不过名字不一样.ucs-2对应utf-16,ucs-4对应UTF-32.UTF-8是没有对应的UCS
- 大小: 100.5 KB
- 大小: 714.4 KB
分享到:
相关推荐
8. **文本编辑器组件**:在GUI应用程序中,如果使用了像TMemo这样的文本编辑组件,记得设置其编码为UTF-8,以便正确显示和保存UTF-8编码的文本。 9. **错误处理**:在处理UTF-8转换时,可能出现编码错误,如非法...
GBK和UTF-8是两种常见的字符编码格式,它们各有优势,但也存在互不兼容的问题,因此,转换工具就显得尤为重要。 GBK编码,全称为“汉字内码扩展规范”,是中国大陆广泛使用的汉字编码标准。GBK是在GB2312的基础上...
UTF-8的优势在于对ASCII字符(英文字符)的高效表示,它使用单个字节表示,与ASCII兼容,因此在互联网上被普遍采用。对于非ASCII字符,如中文、日文等,UTF-8会使用2至4个字节来表示,这使得它具有良好的跨平台和跨...
例如,如果你有一个GBK编码的文本文件需要在网络上传输(网络普遍使用UTF-8),或者你需要将一个Unicode编码的数据库导出到GBK格式,这些函数都能派上用场。 总的来说,理解和熟练运用这些编码转换函数对于开发跨...
在处理不同编码格式的文件时,如需将GBK(GB2312)编码的文件转换为UTF-8,或者反之,就需要借助专门的转换工具。"UTF-8工具"很可能就是这样一款软件,它可以批量处理文件编码的转换工作,提高工作效率。批量转换...
GBK编码是GB2312编码的扩展,包含了更多的汉字和符号,但在全球化背景下,UTF-8编码因其兼容性和效率优势而受到青睐。UTF-8是一种变长的Unicode编码方式,它可以表示Unicode字符集中所有的字符,且在ASCII范围内与...
在SEO(搜索引擎优化)中,网站的编码类型,如GBK和UTF-8,确实会对搜索引擎的爬取和索引过程产生影响。以下是关于这两种编码方式对SEO的具体分析: 1. **空间效率**:GBK编码使用双字节表示汉字,而UTF-8则使用三...
标题 "SD1.2UTF-8" 暗示我们关注的是一个名为 SD CMS 的版本 1.2,特别是一个经过优化支持 UTF-8 字符编码的版本。UTF-8 是一种广泛使用的字符编码标准,它能表示几乎所有的Unicode字符,包括中文、英文和其他多种...
SBUnicode编码在日语环境中广泛使用,但全球范围内不如UTF8和UTF16普遍。 回到我们的压缩包文件,27ca15e28b3d4507bcfe1d904c217899可能包含了467个emoji的图片和对应的编码数据。这些数据对于开发者来说非常有用,...
7. **UTF-8到GBK字符集转换**:这种转换常用于处理中文环境,因为GBK编码在中国大陆使用更为广泛,而UTF-8则在国际互联网上普遍使用。转换过程需要注意的是,不是所有UTF-8字符都能准确转换为GBK,因为GBK的字符集比...
UTF-8的优势在于其向后兼容ASCII码,这意味着ASCII码中的所有字符在UTF-8中只占1个字节,这使得在处理英文文本时,UTF-8的存储效率较高。而UTF-16在处理包含多种语言的文本时,由于其固定的字节数,使得在内存管理和...
- UTF-8的优势在于普遍支持,大多数编程语言和操作系统都原生支持,且在Web上使用广泛,减少了乱码问题。 3. **乱码产生的原因** - 不同的编码格式:当一个文件用一种编码读取,而系统或软件期望的是另一种编码时...
UTF8是一种广泛使用的字符编码,它支持Unicode标准,可以表示多种语言的字符,并且由于其编码方式的灵活性,被普遍用于网络传输。但是,如果在UTF8编码的文件开头引入了BOM(字节顺序标记),可能会导致浏览器和其他...
"sjp" 是一个专门为波兰语设计的词典资源,它以 UTF-8 编码格式存储,采用了 JSON(JavaScript Object Notation)数据交换格式,这使得数据的读取、解析和处理变得更为便捷。 1. **UTF-8编码**:UTF-8是一种广泛...
例如,对于同一个中文字符,如果在UTF-8、GBK和Big5下分别表示为16进制序列A, B和C,运维人员可以通过对比这些序列来找出问题所在,比如在传输过程中可能出现的编码错误或者解码不匹配问题。 在实际应用中,这个...
最后,Unicode码,现在普遍称为UTF(Unicode Transformation Format),是一种统一的编码标准,它包含了许多编码方式,如UTF-8、UTF-16等,旨在实现全球字符的一致表示。 理解这些编码系统及其相互关系对于编程,...
MS949,也称为EUC-KR,是韩国的一种广泛使用的编码格式,而UTF-8则是全球最普遍的Unicode编码形式,支持几乎所有的语言字符。 首先,我们来理解一下MS949编码。MS949(Extended Unix Code, Korean)是一种针对韩语...
3. **UTF编码**:Unicode有多种不同的编码形式,最常用的是UTF-8、UTF-16和UTF-32。UTF-8是网络上最普遍的编码方式,它以可变长度的方式表示字符,使得英文字符可以使用较少的字节,而复杂字符则使用更多字节。 4. ...
因此,在处理包含特殊汉字的文档时,可能需要考虑使用支持更多字符的编码,如GBK或UTF-8。 2. 版本问题:不同的仿宋_GB2312版本可能存在细微的字形差异,因此在跨平台或跨系统传递文档时,需要确保所有设备都装有...