古村落的梦——卞之琳

  很久很久之前,有一群人,他们决定用8个可以开合的结晶管来组合成差其余情事,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把那名叫”字节“。再后来,他们又做了部分可以处理这么些字节的机械,机器开动了,可以用字节来组成出无数状态,状态开端变来变去。他们看来那般是好的,于是它们就那机器称为”计算机“。

小镇上有二种声音

  初阶总括机只在美利坚合众国用。八位的字节一共可以整合出256(2的8次方)种不一致的气象。
他们把内部的号码从0开端的32种情状分别规定了特种的用途,一但终端、打印机遇上约定好的那一个字节被传过来时,就要做一些预定的动作。遇上0×10,
终端就换行,遇上0×07, 终端就向人们嘟嘟叫,例好遇上0x1b,
打印机就打印反白的字,或者极端就用彩色彰显字母。他们看来那般很好,于是就把那一个0×20以下的字节状态叫做”控制码”。他俩又把持有的空
格、标点符号、数字、大小写字母分别用一连的字节状态表示,一向编到了第127号,这样统计机就足以用差距字节来囤积西班牙语的文字了。我们看来如此,都感觉到
很好,于是我们都把那一个方案叫做 ANSI
的”Ascii”编码(American Standard
Code for Information
Interchange,米国音讯调换标准代码)。当时世界上有着的电脑都用同一的ASCII方案来保存英文文字。

同样的寂寥∶

  后来,就像是建造巴比伦塔同一,世界各州的都伊始采取计算机,可是洋洋国度用的不是英文,他们的字母里有诸多是ASCII里没有的,为了可以在处理器
保存他们的文字,他们决定使用
127号未来的空位来代表这几个新的假名、符号,还进入了成百上千画表格时须求用下到的横线、竖线、交叉等造型,一直把序号编到了最后一个气象255。从128
到255这一页的字符集被称”扩充ASCII码“
。从此之后,贪婪的人类再没有新的情景可以用了,美帝国主义可能没有想到还有第三世界国家的大千世界也目的在于可以用到统计机吧!

白日是六柱预测锣,

  等中国人们获取计算机时,已经没有可以动用的字节状态来代表汉字,况且有6000多少个常用汉字须要保留呢。可是那难不倒智慧的中原国民,大家不客气
地把那个127号之后的奇异符号们间接收回掉,
规定:一个紧跟于127的字符的意义与原来一样,但几个高于127的字符连在同步时,就意味着一个汉字,前边的一个字节(他称之为高字节)从0xA1用到
0xF7,前面一个字节(低字节)从0xA1到0xFE,那样我们就可以组合出大约7000多个简体汉字了。在那个编码里,大家还把数学符号、班加罗尔希腊共和国(Ελληνική Δημοκρατία)的
字母、日文的假名们都编进去了,连在 ASCII
里本来就部分数字、标点、字母都统统重新编了四个字节长的编码,那就是常说的”全角”字符,而原来在127号以下的那个就叫”半角”字符了。
中国国民看到这么很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312
是对 ASCII 的汉语扩充。

夜间是梆子。

  不过中国的汉字太多了,我们很快就就发现有诸四个人的人名没有艺术在此处打出来,越发是一些很会麻烦别人的国度领导人。于是大家不得不继续把
GB2312 没有利用的码位找出来老实不虚心地用上。
后来依然不够用,于是干脆不再需要低字节一定是127号之后的内码,只要首个字节是高于127就稳定表示那是一个中国字的起始,不管前面跟的是否扩大字
符集里的情节。结果伸张之后的编码方案被誉为 GBK 标准
,GBK包括了GB2312
的装有内容,同时又充实了近20000个新的方块字(包涵繁体字)和标志。
后来少数民族也要用电脑了,于是大家再扩张,又加了几千个新的少数民族的字,GBK扩成了
GB18030。从此之后,中华民族的学问就能够在微机时代中继承了。
中国的程序员们见到这一层层汉字编码的正经是好的,于是通称他们叫做
DBCS“(Double Byte Charecter Set
双字节字符集)。在DBCS连串标准里,最大的特性是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,由此她俩写的程序为了协助粤语处理,必需求留意字串里的每一个字节的值,假使这几个值是当先127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的处理器僧侣
们都要每一日念上面那几个咒语数百遍:
“一个中国字算八个英文字符!一个汉字算八个英文字符……”

敲不破旁人的梦,

  因为当时逐一国家都像中国那样搞出一套自己的编码标准,结果相互之间哪个人也不懂什么人的编码,何人也不辅助别人的编码,连大陆和台湾那样只相隔了150海里,使用着同一种语言的兄弟地区,也各自采纳了差其他 DBCS
编码方案——当时的神州人想让电脑突显汉字,就非得装上一个”汉字系统”,专门用来拍卖汉字的来得、输入的标题,可是丰盛吉林的无知封建人员写的六柱预测程序就非得加装另一套辅助BIG5
编码的哪些”倚天汉字系统”才足以用,装错了字符系统,突显就会乱了套!那咋做?而且世界民族之林中还有那些一时用不上电脑的贫寒百姓,他们的文字又怎么办? 真是电脑的巴比伦塔命题啊!

做着梦似的

  正在这时,大天使加布里埃尔及时出现了——一个叫
ISO(国际标何人化协会)的国际社团控制入手解决这些标题。他们利用的法门很粗略:废了具有的地区性编码方案,重新搞一个席卷了地球上具备知识、所有字母和标记
的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称
UCS, 俗称 “unicode“。

瞎子在街上走,

  unicode早先制订时,总计机的存储器容量极大地发展了,空间再也不成为难题了。于是
ISO
就一贯确定必须用七个字节,也就是16位来归并意味着拥有的字符,对于ASCII里的这么些“半角”字符,unicode包持其原编码不变,只是将其尺寸由原来的8位增加为16位,而任何知识和语言的字符则全体再次联合编码。由于”半角”英文符号只须要用到低8位,所以其高8位永远是0,由此那种大气的方案在
保存英文文本时会多浪费一倍的半空中。UNICODE 的限制是0x0000 –
0xFFFF共6万八个字符

一步又一步。

  那时候,从旧社会里走过来的程序员初叶意识一个竟然的风貌:他们的strlen函数靠不住了,一个汉字不再是一定于八个字符了,而是一个!是的,从unicode开首,无论是半角的英文字母,仍旧全角的方块字,它们都是联合的”一个字符“!同时,也都是统一的”多少个字节“,请留心”字符”和”字节”多少个术语的例外,“字节”是一个8位的情理存贮单元,而“字符”则是一个知识有关的记号。在unicode中,一个字符就是多少个字节。一个中国字算三个英文字符的一世已经快过去了。

她精通哪一块石头低,

  unicode同样也不周全,那里就有三个的难题,一个是,如何才能分别unicode和ascii?计算机怎么知道三个字节表示一个标记,而不是独家代表五个标志呢?首个难题是,大家已经清楚,英文字母只用一个字节表示就够了,假如unicode统一规定,每个符号用多少个或三个字节表示,那么每个英文字母前都一定有二到三个字节是0,那对于仓储空间来说是庞大的荒废,文本文件的尺寸会就此大出二三倍,那是难以接受的。

哪一块石头高,

  unicode在很长一段时间内不可能松开,直到网络的面世,为缓解unicode怎么样在互联网上传输的题材,于是面向传输的居多
UTF(UCS Transfer
Format)标准出现了,顾名思义,UTF-8就是每便8个位传输数据,而UTF-16纵使每一遍16个位。UTF-8就是在网络上使用最广的一种unicode的落到实处形式,那是为传输而部署的编码,并使编码无国界,这样就足以显得举世上保有知识的字符了。

哪一家姑娘有多大岁数。

  UTF-8最大的一个特性,就是它是一种变长的编码格局。它可以应用1~4个字节表示一个标志,根据区其余标志而变化字节长度,当字符在ASCII
码的限制时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一有的,注意的是unicode一个中文字符占2个字节,而UTF-8一个华语字符占3个字节)。从unicode到uft-8并不是一向的相应,而是要过一些算法和规则来更换。

敲沉了人家的梦,

Unicode符号范围 | UTF-8编码格局

做着梦似的

(十六进制) | (二进制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

更夫在街上走,

总结:

一步又一步。

Unicode和UTF-16:1个字符占2个字节(不管是哪国语言)

他了解哪一块石头低,

UTF-8:1个英文字符占1个字节,一个中国字(包括日文和朝鲜语等)占3个字节

哪一块石头高,

Java中的char默许采取Unicode编码,所以Java中char占2个字节。

哪一家门户关得最严刻。

  受到过网络编程加持的电脑僧侣们都精通,在网络里传递音信时有一个很重大的难点,就是对此数据高低位的解读方式,一些电脑是利用低位头阵送的艺术,例如大家PC机采取的
INTEL
架构,而另一部分是运用高位先发送的方式,在网络中交流数据时,为了审批双方对于高低位的认识是或不是是一致的,接纳了一种很省心的办法,就是在文本流的始发时向对方发送一个标志符——要是以后的公文是高位在位,那就发送”FEFF”,反之,则发送”FFFE”。不信你可以用二进制形式打开一个UTF-X格式的文本,看看初始三个字节是或不是那多少个字节?

「三更了,你听哪,

  讲到那里,大家再顺便说说一个很盛名的奇怪景观:当你在 windows
的记事本里新建一个文书,输入”联通”多个字之后,保存,关闭,然后重新打开,你会发觉那七个字已经不复存在了,代之的是多少个乱码!呵呵,有人说那就是联通之所以拼但是移动的原因。其实这是因为GB2312编码与UTF8编码暴发了编码冲撞的缘故。

毛儿的老爹,

  例如”汉”字的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,那一个字符什么也不是。这就是唯有”联通”四个字的文书并未章程在记事本教头常呈现的因由。而如若您在”联通”之后多输入多少个字,其余的字的编码不见得又正好是110和10发轫的字节,那样重复打开时,记事本就不会坚定不移那是一个utf8编码的文本,而会用ANSI的方法解读之,那时乱码又不出现了。

敲锣的又过桥,

  好了,终于可以回答NICO的题材了,在数据库里有n前缀的字串类型就是UNICODE类型,那序列型中,固定用多个字节来代表一个字符,无论这几个字符是汉字依旧英文字母,或是其他什么。

绵绵的是桥下流水的声息。

  假设你要测试”abc汉字”这么些串的长度,在尚未n前缀的数据类型里,那一个字串是7个字符的尺寸,因为一个汉字相当于七个字符。而在有n前缀的数据类型里,同样的测试串长度的函数将会告诉您是5个字符,因为一个中国字就是一个字符。

 

转自:http://wenku.baidu.com/view/cb9fe505cc17552707220865.html

作者:JekyllJi

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图