求0.1 717 71 71 76 7 03 31#57 6是哪首钢琴最难的曲子曲子里的

Sp值变化表 (151102期第106场) -- 彩客酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
要了解MySQL的编码,必须先了解编码。
所谓的信息,在计算机中不过是一串的位(bit:0 or 1),每8个bit组成了一个字节,而这些字节到底表示什么,取决于读到这些对象的上下文,1个字节序列,可以表示整数,字符串或者机器指令,当然也可以表示中文,日文,甚至上古文字。
信息=位+上下文
而为了确定字符与二进制位的对应关系,就必须制定编码。
因为计算机是西方发明的,所以最早的也是我们最熟悉的编码ASCII主要包含的也就是26个基本拉丁字母(大小写)、阿拉伯数目字和英式标点符号等。但地球其它地方的人们也需要现代化,也要使用计算机,靠ASCII仅仅7个bit,128个字符位是不可能表示所有国家、地区的字符的。特别是像汉字这种非拼音字符,常用的也有几千个,1个字节都放下不。
于是经过很多年的发展,现在的字符编码主要有两大体系,ANSI和UNICODE。
ANSI是由一个母体(ASCII)出发,产生了多个不兼容平行分支(LATIN1、GBK、JIS)。而UNICODE体系则将所有的字符统一于一种编码规范之下,所谓&天下大同,唯此一码&,可以包含地球上所有的语言文字符号。
ANSI编码占用的空间较少,如汉字是双字节,但只能支持一种非ASCII语言,适用于个性化的个人PC操作系统;UNICODE支持所有语言,但是是多字节编码,占用空间较大,如汉字是3字节,一般适用于数据传输和web页面。
下面具体来说说这2大体系:
二,ANSI体系
ANSI是指美国国家标准学会,成立于1918年,制定了很多工业标准,ASCII编码是由ANSI最初制定;而UNICODE由ISO制定,ISO是国际标准化组织,成立于1947年,ANSI是ISO的重要成员。
ANSI体系:
又称为ISO-646,ASCII只对基本控制符号、英文、数字、标点进行了编码,为了在计算机上存储各个国家的语言,各个国家根据自己的语言特点,制定了完全兼容ASCII的编码,例如西欧语言的latin-1(ISO-8859-1)、中文的GBK、日语的JIS等,需要注意的是这些编码之间互不兼容。当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。在windows系统中,ANSI编码具体采用哪种表现形式,由操作系统的语言内码决定,简体中文的采用GBK表达,日文用JIS表达等。所以,可以认为,在简体中文windows系统中,ANSI=GBK,在日文系统中,ANSI=JIS。
美国信息交换标准代码,等同于国际标准ISO/IEC 646,ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今为止共定义了128个字符;33个字符无法显示(这是以现今操作系统为依归,但在DOS模式下可显示出一些诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈旧的控制字符。控制字符的用途主要是用来操控已经处理过的文字。在33个字符之外的是95个可显示的字符,包含26个基本拉丁字母、阿拉伯数目字和英式标点符号等。ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如na&ve、caf&、&lite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)。
ASCII的33个控制字符:
名称/意义
空字符(Null)
垂直定位符号
取消变换(Shift out)
启用变换(Shift in)
跳出数据通讯
设备控制一(XON 激活软件速度控制)
设备控制二
设备控制三(XOFF 停用软件速度控制)
设备控制四
确认失败回应
同步用暂停
区块传输结束
连接介质中断
文件分区符
组群分隔符
记录分隔符
单元分隔符
注意,输入控制字符需要用ctrl+脱出字符,比如telnet下面的Escape character is &^]& ,实际输入要用ctrl+],而不是^+]
ASCII的95个可显示字符:
扩展的ASCII包含ASCII中已有的128个字符(数字0&32显示在下图中),又增加了128个字符,总共是256个。
Latin1是ISO-8859-1的别名,也等同于Windows cp1252 ,有些环境下写作Latin-1。
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0&00-0xFF,0&00-0&7F之间完全和ASCII一致,0&80-0&9F之间是控制字符,0xA0-0xFF之间是文字符号。
ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。
MySQL数据库默认编码Latin1可以存放汉字就是利用这个原理,实际的编码其实是GBK或者UTF8。
ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
标准latin1编码表:
在上表中,0&20是空格、0xA0是不换行空格、0xAD是选择性连接号。0&00-0&1F、0&7F、0&80-0&9F在此字符集中未有定义。(控制字符是由ISO/IEC 6429定义)。
注意MySQL中的latin1和标准latin1是有区别的,我们说过0&80-0&9F之间是未定义的,MySQL把这部分编码拿出来,自己指定了字符,比如欧元符号!如下表所示:
128 80 E282AC & €
C281 � 
130 82 E2809A & ‚
C692 & ƒ
132 84 E2809E & „
133 85 E280A6 & …
134 86 E280A0 & †
135 87 E280A1 &D ‡
CB86 & ˆ
137 89 E280B0 & ‰
C5A0 &S Š
139 8B E280B9 & ‹
C592 &OE Œ
C28D � 
C5BD Ž
C28F � 
C290 � 
145 91 E28098 & ‘
146 92 E28099 & ’
147 93 E2809C & “
148 94 E2809D & ”
149 95 E280A2 & •
150 96 E28093 & –
151 97 E28094 & —
CB9C & ˜
153 99 E284A2 & ™
C5A1 & š
155 9B E280BA & ›
C593 & œ
C29D � 
C5BE ž
C5B8 &Y Ÿ
C2B2 ² ²
C2B3 ³ ³
C2B9 ¹ ¹
C2BC ¼ ¼
C2BD ½ ½
C2BE ¾ ¾
C380 &A &A
C381 &A &A
C382 &A &A
C383 &A &A
C384 &A &A
C385 &A &A
C386 &AE &AE
C387 &C &C
C388 &E &E
C389 &E &E
C38A &E &E
C38B &E &E
C38C &I &I
C38D &I &I
C38E &I &I
C38F &I &I
C390 Ð Ð
C391 &N &N
C392 &O &O
C393 &O &O
C394 &O &O
C395 &O &O
C396 &O &O
C398 &O &O
C399 &U &U
C39A &U &U
C39B &U &U
C39C &U &U
C39D &Y &Y
C39E Þ Þ
测试如下:
select hex(&&&);
GB2312-&GBK-&GB18030:
GB 2312 或 GB 2312-80 是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集&基本集》,又称GB0,由中国国家标准总局发布,日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。
GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
GB 2312中对所收汉字进行了&分区&处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
每个汉字及符号以两个字节来表示。第一个字节称为&高位字节&,第二个字节称为&低位字节&。&高位字节&使用了0xA1-0xF7(把01-87区的区号加上0xA0),&低位字节&使用了0xA1-0xFE(把01-94加上0xA0)。
因为GB 2312 不足表示所有的汉字,此编码标准只收录了6763个常用汉字,而GB字库以外大量汉字,如中国前总理朱F基的&F&字,只能通过补字软件拼字或其它造字程序补字。尽管补出的汉字在字形上满足需要,但在字体风格、大小、结构方面难以协调统一,并且无法检索。
1993年,Unicode 1.1版本推出,收录中国大陆、台湾、日本及韩国通用字符集的汉字,总共有20,902个。
中国大陆订定了等同于Unicode 1.1版本的&GB &&信息技术通用多八位编码字符集(UCS)第一部分:体系结构与基本多文种平面&。
微软利用GB 2312-80未使用的编码空间,收录GB 全部字符制定了GBK编码。它实际上是CP936字码表 (Code Page 936)的扩展(之前CP936和GB 2312-80一模一样),最早实现于Windows 95简体中文版。虽然GBK收录GB 的全部字符,但编码方式并不相同。
GBK自身并非国家标准,只是曾由国家技术监督局标准化司、电子工业部科技与质量监督司公布为&技术规范指导性文件&。
原始GB13000一直未被业界采用,后续国家标准GB18030技术上兼容GBK而非GB13000。
编码范围如下表:
水准 GBK/1
水准 GBK/2
水准 GBK/3
40&FE(7F除外)
水准 GBK/4
40&A0(7F除外)
水准 GBK/5
40&A0(7F除外)
40&A0(7F除外)
GBK共收入21886个汉字和图形符号
* GB2312中的全部汉字、非汉字符号。
* BIG5中的全部汉字。
* 与ISO 10646相应的国家标准GB13000中的其它CJK汉字,以上合计20902个汉字。
* 其它汉字、部首、符号,共计984个。
中华人民共和国国家质量技术监督局于日推出了GB 标准,以取代GBK。GB 除保留全部GBK编码汉字,在第二字节把能使用范围再度进行扩展,增加了大约一百个汉字及四位元组编码空间,但是将GBK作为子集全部保留。
GB18030 编码是一二四字节变长编码。一字节部分从 0&0~0&7F 与 ASCII 编码兼容。 二字节部分, 首字节从 0&81~0xFE, 尾字节从 0&40~0&7E 以及 0&80~0xFE, 与 GBK标准基本兼容。
四字节部分, 第一字节从 0&81~0xFE, 第二字节从 0&30~0&39, 第三和第四字节的范围和前两个字节分别相同。 四字节部分覆盖了从 0&0080 开始, 除去二字节部分已经覆盖的所有 Unicode 3.1 码位。也就是说, GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。
三,UNICODE体系
下面来看看UNICODE体系:
UNICODE即ISO-10646,最终由ISO组织规范。
UNICODE定义了字符编码的序列关系。而真正进行编码的时候,有两种方式,UCS-2和UCS-4。UCS-2为两字节编码,范围在0&0000-0xffff之间,定义2^16=65536个码位;UCS-4为四字节编码,范围在0&xffffffff之间,定义2^32=个码位。
由于UNICODE是多字节编码,在传输过程中需在字节序、容错性方面进行定义。基本可以认为 UTF16=UCS2,UTF-32=UCS4,这两种都是定长编码,即每个字符的编码都是固定长度的。通常意义上所说的UNICODE是指UTF-16。
而UTF8是一种变长编码,每个字符的编码长度由1-3位不等;这样在单字节字符为主的情况下,UTF-8在存储效率、传输效率和容错性上有显著的性能优势,成为互联网数据传输和网页展示的主流编码方式。
在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 &/0& 或 &/&, 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码.
UCS和UTF的转换关系如下:
UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP(Basic Multilingual Plane)字符最多只用到3字节长。
U- & U-0000007F: 0xxxxxxx
U- & U-000007FF: 110xxxxx 10xxxxxx
U- & U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U- & U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U- & U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U- & U-7FFFFFFF: xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
转换关系如下图所示:
三,编码转换
ASCII、LATIN-1、UNICODE之间是如何转换?
如图所示,以10进制计。ASCII和LATIN1是单字节编码,8BIT的LATIN1编码当最高位为0时,与ASCII一致。
16BIT的UTF16当高8位为0时,低八位表示的编码与LATIN1一致。
而ANSI和UNICODE通过编码对照表,一一进行对应和转换,每种ANSI体系的编码,都存在一个转换UNICODE的对照表。例如GBK&=&UTF16对照表、JIS&=&UTF16对照表。
五,编码识别
对于一个文本文件,计算机如何知道是采用何种编码并进行正确的显示呢?
字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号并且可以表示是大端序还是小端序。具体如下表所示:
不同编码的字节顺序标记的表示
239 187 191
(大端序)
00 00 FE FF
0 0 254 255
(小端序)
FF FE 00 00
255 254 0 0
2B 2F 76和以下的一个字节:[ 38 | 39 | 2B | 2F ]
43 47 118和以下的一个字节:[ 56 | 57 | 43 | 47 ]
247 100 76
DD 73 66 73
221 115 102 115
14 254 255
FB EE 28及可能跟随着FF
251 238 40及可能跟随着255
84 31 95 33
132 49 149 51
如果没有BOM标志,采用顺序检测:如果所有单字节字符都在0&00-0&7f之间,则为ASCII;否则,根据编码特征确定是哪种编码,如果错误的编码导致编码特征冲突,则会出现乱码。
比如当txt文档中一切字符都在 C0&AA(第一个字节)&DF 80&BB(第二个字节)&BF 这个范围时,notepad都无法确认文档地格式,没有自动依照GB2312格式来&Display&。 比如&联通&就是C1 AA CD A8,刚好在上面范围内,所以不能正常显现。因为程序认为它更像一个UTF-8编码文本。这是因为&联通&两个字的GB-2312编码看起来更像UTF-8编码导致的。
& 相关主题:4发现相似题

我要回帖

更多关于 海上钢琴师曲子 的文章

 

随机推荐