ANSI, UTF-8, Unicode, GBK, GB2312 字符编码小结

这两天碰见一个Bug,涉及到字符编码,一通乱搜后,索性研究了下,整理出来,以便今后查阅。

ASCII码,0~127,128个,这个就不用多说了,他是计算机文明的基石。但是这里面只有英文字母,其他国家如何把本国的文字输入到电脑中呢?所以基本每种语言都有自己的字符集,如汉字就有GB2312(简体中文),BIG5(繁体中文)等等。

但不同的ANSI编码在不同语言之间是不兼容的,所以对于不同的操作系统之间文件的传输,或者在同样的操作系统下,源文件语言不同于OS的语言文件的传输,需要转换成UTF-8格式。

如何转换呢?

GBK、GB2312等与UTF-8之间都必须通过Unicode编码才能相互转换:

GBK、GB2312 -->  Unicode  -->  UTF-8

UTF-8               --> Unicode   -->  GBK、GB2312

具体区别:

ANSI: 16384个字符。这就是ANSI字符标准。英文一个字节,中文两个字节。中文的网页和操作系统中通常采用ANSI编码,这也是微软OS的一个字符标准。对于ANSI,不同的国家和地区制定了不同的标准,由此产生了GB2312(简体中文),BIG5(繁体中文),JIS(日文)等各自的编码标准。但不同的ANSI编码在不同语言之间是不兼容的,所以对于不同的操作系统之间文件的传输,或者在同样的操作系统下,源文件语言不同于OS的语言文件的传输,需要转换成UTF-8格式。

UNICODE:使用两个字节对世界上几乎所有的语言进行编码(0x0000-0xFFFF),65536个字符,每种语言的代码段不同,两个字节(英文、中文都是两个字节)所表达的字符是唯一的,所以不同语种可以共存于文本中,解决国际化的问题。

UTF-8: 是Unicode一种压缩形式,英文A在Unicode中表示为0x0041,老外觉得这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了UTF-8编码,但是汉字在UTF-8中占3个字节,显然用做中文不如ANSI合算,这就是中国的网页用作ANSI编码而老外的网页常用UTF-8的原因。

=========================================================

特别提下Unicode
UTF-8区别:

Unicode:

Unicode字符集,它固定使用16bits(两个字节)来表示一个字符,共可以表示65536个字符,
标准的Unicode称为UTF-16(UTF: UCS Transformation Format )。

后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。毕竟互联网70%以上的信息仍然是英文。如果连英文都用2个字节存取(UCS-2),空间浪费不就太多了?所以UTF-8就出来了。

UTF-8: (UCS TransformationFormat)

所谓UTF-8就是这样一个为了提高英文存取效率的字符集转换格式:Unicode Transformation Form 8-bit form。用UTF-8,UNICODE的2字节字符用变长个(1-3个字节)表示:

对英文,仍然和ASCII一样用1个字节表示,这个字节的值小于128(/x80);对其他语言的用一个值位于128-256之间的字节开始,再加后面紧跟的2个字节表示,一个字符一共是3个字节;UTF-8编码字符理论上可以最多到
6 个字节长, 然而 16
位 BMP 字符最多只用到 3
字节长。Bigendian UCS-4 字节串的排列顺序是预定的。字节 0xFE
和 0xFF 在 UTF-8
编码中从未用到。下列字节串用来表示一个字符。用到哪个串取决于该字符在 Unicode
中的序号。

U-00000000 - U-0000007F:  0xxxxxxx

U-00000080 - U-000007FF:  110xxxxx10xxxxxx

U-00000800 - U-0000FFFF:  1110xxxx10xxxxxx 10xxxxxx

U-00010000 - U-001FFFFF:  11110xxx10xxxxxx 10xxxxxx 10xxxxxx

U-00200000 - U-03FFFFFF:  111110xx10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx

U-04000000 - U-7FFFFFFF:  1111110x10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx

xxx 的位置由字符编码数的二进制表示的位填入。越靠右的 x
具有越少的特殊意义。只用最短的那个足够表达一个字符编码数的多字节串。注意在多字节串中,
第一个字节的开头"1"的数目就是整个串中字节的数目.

例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号)
在 UTF-8 里的编码为:

11000010 10101001 = 0xC2 0xA9

而字符 U+2260 = 0010 0010 0110 0000 (不等于)
编码为:

11100010 10001001 10100000 = 0xE2 0x89 0xA0

这种编码的官方名字拼写为 UTF-8。

OK,收工!

时间: 2024-08-05 15:21:05

ANSI, UTF-8, Unicode, GBK, GB2312 字符编码小结的相关文章

刨根究底字符编码之十——Unicode字符集的字符编码方式CEF以及码点、码元

Unicode字符集的字符编码方式CEF以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节. 比如,汉字"严"的Unicode码(Unicode码点值.Unicode编号)是十六进制数4E25,转换成二进制数有15位(100 1110 0010 0101),对"严"这个字符的编号进行编码的话,至少需要2个字节.表示其他更大编号

ASCII、GBK、Unicode和UTF-8字符编码的区别联系

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为”字节“.再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为”计算机“. 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定好的这些字节被传过来时,就要做

java中的常用字符编码ASCII、Unicode和UTF-8

首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今. ASCI

刨根究底字符编码之八——Unicode编码方案概述

Unicode编码方案概述 1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不同的字符,导致不同的字符集在交换数据时带来极大的不便. 比如大陆和台湾是只相隔150海里.使用着同一种语言的兄弟地区,也分别采用了不同的DBCS双字节字符集编码方案. 以前大陆地区必须装上类似于"UCDOS希望汉字系统"这样的中文处理系统专门来处理简体汉字的显示.输入问题. 而台湾地区由于采用

MySQL字符编码的讨论:如何处理emoji等4字节的Unicode字符 - utf8mb4 vs. utf8 Collations

1. Unicode是什么 Unicode(中文:万国码.国际码.统一码.单一码)是计算机科学领域里的一项业界标准.它对世界上大部分的文字系统进行了整理.编码,使得电脑可以用更为简单的方式来呈现和处理文字. 简单说来,就是把世界上所有语言的字,加上所有能找到的符号(如高音谱号.麻将.emoji)用同一套编码表示出来. 2. UTF-8是什么 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码.可变长度的意思在于,如果能使

java字符编码详解

引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国政府制定的,简体汉字编码规范,大陆所有计算机中的简体中文,都使用此种编码格式.目前,我也不知道还有另外的简体汉字编码规范.与此对应的还有BIG5,是中华民国政府制定的,繁体汉字的编码规范,一般应用于海外计算机的繁体中文显示.所谓的繁体中文Windows,简体中文Windows,指的就是采用BIG5和

几种常见字符集与字符编码

字符集的概念 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 而字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同. 常用字符集 ASCII字符集.GB2312字符集.GBK字符集. USC-3字符集.Unicode字符集等. 字符编码的概念 字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式.自然数序列.8位组或者电脉冲),以

python的 随手记----字符编码与转码

一.前提 那么到底什么是编码呢? //ASCII 记住一句话:计算机中的所有数据,不论是文字.图片.视频.还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的. 再说简单点,计算机只懂二进制数字! 所以,目的明确了:如何将我们能识别的符号唯一的与一组二进制数字对应上?于是美利坚的同志想到通过一个电平的高低状态来代指0或1, 八个电平做为一组就可以表示出 256种不同状态,每种状态就唯一对应一个字符,比如A--->00010001,而英文只有26个字符,算上一些特殊字符和数字,1

精述字符编码(读这篇绝对不够)

带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BOM,BMP,Littile Endian,Big Endian,内码,外码,CodePage. 1.导语 字符编码(Character Encoding)是计算机显示文本的基础,是每一位IT从业者必知的计算机基础知识点,如同数值在计算中如何存储表示,那么基础,那么重要.然因字符编码历史久远,变更频繁,地域差