精华内容
下载资源
问答
  • 常见的编码如下:国外:ASCII(1968年) ISO8859-1(1987年)UNICODE(1994年)+ + + + + + ...

    常见的编码如下:

    国外:ASCII(1968年)               ISO8859-1(1987年) UNICODE(1994年)

    +                 +                         +                                 +                    +                    +              >

    国内:                      GB2312(1980年)                                        GBK(1995年) GB18030(2000年)

    ASCII是目前计算机中用得最广泛的字符集及其编码,是由美国(美国最先使用电脑)国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式(能组成256种状态,即可表示256个符号)。

    ASCII码的取值范围是0~127,可以用7个bit表示。C语言中char型变量的大小规定为一字节,如果存放ASCII码则只用到低7位,高位为0。以下是ASCII码表:

    图 A.1. ASCII码表

    0818b9ca8b590ca3270a3433284dd417.png

    绝大多数计算机的一个字节是8位,取值范围是0~255,而ASCII码并没有规定编号为128~255的字符,为了能表示更多字符,各厂商制定了很多种ASCII码的扩展规范。注意,虽然通常把这些规范称为扩展ASCII码(Extended ASCII),但其实它们并不属于ASCII码标准。例如以下这种扩展ASCII码由IBM制定,在字符终端下被广泛采用,其中包含了很多表格边线字符用来画界面。

    图 A.2. IBM的扩展ASCII码表

    0818b9ca8b590ca3270a3433284dd417.png

    在图形界面中最广泛使用的扩展ASCII码是ISO-8859-1,也称为Latin-1,其中包含欧洲各国语言中最常用的非英文字母,但毕竟只有128个字符,某些语言中的某些字母没有包含。如下表所示。

    图 A.3. ISO-8859-1

    0818b9ca8b590ca3270a3433284dd417.png

    编号为128~159的是一些控制字符,在上表中没有列出。

    英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。

    但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段,所以出现后面的统一编码方式。

    ISO-8859-1收录的

    字符除ASCII收录的字符外,还包括

    西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。

    欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。

    因为ISO-8859-1编码范围使用了单

    字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的

    字节流都不会被抛弃。换言之,把其他任何编码的

    字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,

    MySQL数据库默认编码是Latin1就是利用了这个特性。

    ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。

    比如,虽然“中文”两个字不存在ISO 8859-1编码,但可以用iso8859-1编码来“表示”。GB2312编码“中文”是"d6d0 cec4"两个字符,使用ISO 8859-1编码来表示的时候则将它拆开为4个字节来表示,即"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。如果使用Unicode编码,则为"4e2d 6587";使用UTF编码,则是6个字节"e4 b8 ad e6 96 87"。很明显,这种使用ISO 8869-1对汉字进行表示的方法还需要以另一种编码为基础。

    在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的:

    GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

    1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。

    从ASCII、GB2312到GBK,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK都属于双字节字符集 (DBCS)。

    2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增加了CJK(中日韩)扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。

    也就是说Big5支持繁体中文,GB2312支持简体中文,Big5,GB2312是GBK的子集,GBK是GB18030的子集。

    正如上面所述,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

    Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

    比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示比他更大的符号,可能需要3个字节或者4个字节,甚至更多。这里就有两个严重的问题:

    第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?

    第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

    它们造成的结果是:

    1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。

    2)unicode在很长一段时间内无法推广,直到互联网的出现。

    互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

    UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。其编码规则很简单,只有二条:

    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

    2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

    下表总结了编码规则,字母x表示可用编码的位。

    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

    下面,以汉字“严”为例,演示如何实现UTF-8编码。

    已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

    总结:

    1)从计算机对多国语言的支持角度看,大致可以分为三个阶段:

    系统内码

    说明

    系统

    阶段一

    ASCII

    计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。

    英文 DOS

    阶段二

    ANSI编码

    (本地化)

    为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。

    不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

    不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

    中文 DOS,中文 Windows 95/98,日文 Windows 95/98

    阶段三

    UNICODE

    (国际化)

    为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

    Windows NT/2000/XP,Linux,Java

    2)根据编码规则的特点,把所有的编码分成三类:

    分类

    编码标准

    说明

    单字节字符编码

    ISO-8859-1

    最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "ÖÐ"。

    反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。

    ANSI 编码

    GB2312,

    BIG5,

    Shift_JIS,

    ISO-8859-2 ……

    把 UNICODE 字符串通过 ANSI 编码转化为“字节串”时,根据各自编码的规定,一个 UNICODE 字符可能转化成一个字节或多个字节。

    反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。比如,[0xD6, 0xD0] 这两个字节,通过 GB2312 转化为字符串时,将得到 [0x4E2D] 一个字符,即 '中' 字。

    “ANSI 编码”的特点:

    1. 这些“ANSI 编码标准”都只能处理各自语言范围之内的 UNICODE 字符。

    2. “UNICODE 字符”与“转换出来的字节”之间的关系是人为规定的。

    UNICODE 编码

    UTF-8,

    UTF-16, UnicodeBig ……

    与“ANSI 编码”类似的,把字符串通过 UNICODE 编码转化成“字节串”时,一个 UNICODE 字符可能转化成一个字节或多个字节。

    与“ANSI 编码”不同的是:

    1. 这些“UNICODE 编码”能够处理所有的 UNICODE 字符。

    2. “UNICODE 字符”与“转换出来的字节”之间是可以通过计算得到的。

    我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节,我们只需要知道“编码”的概念就是把“字符”转化成“字节”就可以了。对于“UNICODE 编码”,由于它们是可以通过计算得到的,因此,在特殊的场合,我们可以去了解某一种“UNICODE 编码”是怎样的规则。

    展开全文
  • UnicodeGB18030、GBK、GB2312

    千次阅读 2021-03-19 19:05:31
    编码举例-先入为主: 䶮 Unicode:4DAE (CJK扩展A) Unicode PUA:E863(UTF-16BE) UTF-8:(EF BB BF) E4 B6 AE ...GB18030:FE9F GBK:FE9F GB2312:没有 㵥 Unicode:3D65 (CJK扩展A) UTF-8:(EF BB

    编码举例-先入为主:

    Unicode:4DAE (CJK扩展A)
    Unicode PUA:E863(UTF-16BE)
    UTF-8:(EF BB BF) E4 B6 AE
    UTF-16BE:(FEFF) 4DAE
    UTF-16LE:(FFFE) AE4D
    UTF-32BE:(0000FEFF) 00004DAE
    UTF-32LE:(FFFE0000) AE4D0000
    GB18030:FE9F
    GBK:FE9F
    GB2312:没有


    Unicode:3D65 (CJK扩展A)
    UTF-8:(EF BB BF) E3 B5 A5
    UTF-16BE:(FEFF) 3D65
    UTF-16LE:(FFFE) 653D
    UTF-32BE:(0000FEFF) 00003D65
    UTF-32LE:(FFFE0000) 653D0000
    GB18030:8231E230
    GBK:没有
    GB2312:没有

    𠅤
    Unicode:20164 (CJK扩展B)
    Unicode PUA:E0FC (UTF-16BE)
    UTF-8:(EF BB BF) F0 A0 85 A4
    UTF-16BE:(FEFF) D840 DD64
    UTF-16LE:(FFFE) 40D8 64DD
    UTF-32BE:(0000FEFF) 00020164
    UTF-32LE:(FFFE0000) 64010200
    GB18030:9532A632
    GBK:没有
    GB2312:没有

    𬍛
    Unicode:2C35B (CJK扩展E)
    Unicode PUA:E352 (UTF-16BE)
    搜狗自造字PUA:E058(UTF-16BE)
    UTF-8:(EF BB BF) F0 AC 8D 9B
    UTF-16BE:(FEFF) D870 DF5B
    UTF-16LE:(FFFE) 70D8 5BDF
    UTF-32BE:(0000FEFF) 0002C35B
    UTF-32LE:(FFFE0000) 5BC30200
    GB18030:9931D937
    GBK:没有
    GB2312:没有

    𬱖
    Unicode:2CC56 (CJK扩展E)
    Unicode PUA:E43E (UTF-16BE)
    搜狗自造字PUA:E10E(UTF-16BE)
    UTF-8:(EF BB BF) F0 AC B1 96
    UTF-16BE:(FEFF) D873 DC56
    UTF-16LE:(FFFE) 73D8 56DC
    UTF-32BE:(0000FEFF) 0002CC56
    UTF-32LE:(FFFE0000) 56CC0200
    GB18030:9933C336
    GBK:没有
    GB2312:没有

    𪠽 (口当)
    Unicode:2A83D (CJK扩展C)
    Unicode PUA:E27B (UTF-16BE)
    搜狗自造字PUA:E1D5(UTF-16BE)
    UTF-8:(EF BB BF) F0 AA A0 BD
    UTF-16BE:(FEFF) D86A DC3D
    UTF-16LE:(FFFE) 3DDC 6AD8
    UTF-32BE:(0000FEFF) 0002A83D
    UTF-32LE:(FFFE0000) 3DA80200
    GB18030:98369935
    GBK:没有
    GB2312:没有

    我:
    Unicode:6211 (CJK基本区)
    UTF-8: (EF BB BF) E6 88 91
    UTF-16BE: (FEFF) 6211
    UTF-16LE: (FFFE) 1162
    UTF-32BE:(0000FEFF) 00006211
    UTF-32LE:(FFFE0000) 11620000
    GB18030:CED2
    GBK:CED2
    GB2312:CED2

    珺:
    Unicode:73FA (CJK基本区)
    UTF-8: (EF BB BF) E7 8F BA
    UTF-16BE: (FEFF) 73FA
    UTF-16LE: (FFFE) FA73
    UTF-32BE:(0000FEFF) 000073FA
    UTF-32LE:(FFFE0000) FA730000
    GB18030:AC42
    GBK: AC42
    GB2312:没有

    UTF编码的BOM:
    BOM的用途:BOM是Byte Order Mark的缩写,在UTF-16和UTF-32中需要使用BOM来区分字节顺序,因为CPU有两种系列,一种是大端模式,一种是小端模式(常用设备多为该种模式),在两种不同模式的设备互传文件可能出现无法读取的情况,在文件的最前面添加一个BOM便可判断文件的字节顺序是大端序还是小端序,按照BOM所记录的顺序读取,就不会在读取时出错。UTF-8本身并没有大小端之分,但微软旧版Windows记事本中的UTF-8编码使用了UTF-8的BOM。

    各个UTF的BOM:
    UTF-8: EF BB BF
    UTF-16BE: FEFF
    UTF-16LE: FFFE
    UTF-32BE: 0000FEFF
    UTF-32LE: FFFE0000
    LE(Little Endian):小端序存储
    BE(Big Endian):大端序存储

    微软Windows记事本:
    *旧版记事本
    ANSI:为使Windows系统支持多国语言设立的编码,在不同地区的系统下,编码各不相同,可通过设置Windows语言和地区改变编码,在中文简体系统下一般指GBK,CodePage为936,GB18030的CodePage为54936。
    Unicode:指UTF16-LE,UTF-16小端序,在UCS-2下,定长表示,只有BMP平面,UTF-16的编码几乎和Unicode编码一致,因此当时把UTF-16LE写成Unicode。
    Unicode big endian:指UTF16-BE,UTF-16大端序,在UCS-2下,定长表示,只有BMP平面,UTF-16的编码几乎和Unicode编码一致,因此当时把UTF-16BE写成Unicode big endian。
    UTF-8:带有BOM的UTF-8编码。

    *新版记事本(Windows10 1909版):
    ANSI:为使Windows系统支持多国语言设立的编码,在不同地区的系统下,编码各不相同,可通过设置Windows语言和地区改变编码,在中文简体系统下一般指GBK,CodePage为936,GB18030的CodePage为54936。
    UTF16-BE:UTF-16大端序
    UTF16-LE:UTF-16小端序
    UTF-8:UTF-8编码
    UTF-8 with BOM:带有BOM的UTF-8编码

    Unicode的平面
    Unicode有17个平面,即第0平面(0000-FFFF)到第16平面(100000-10FFFF)。
    第0平面称为BMP(Basic Multilingual Plane)平面,又称为基本多文种平面,其范围为0000-FFFF,第0平面外的平面统称为辅助平面。
    第1辅助平面称为SMP(Supplementary Multilingual Plane)平面,又称为多文种补充平面,主要摆放拼音文字及符号,其范围为10000-1FFFF。
    第2辅助平面称为SIP(Supplementary Ideographic Plane)平面,又称为表意文字补充平面,其范围为20000-2FFFF。
    第3辅助平面称为TIP(Tertiary Ideographic Plane)平面,又称为表意文字第三平面,其范围为30000-3FFFF。
    第4至13辅助平面尚未使用。
    第14辅助平面称为SSP(Supplementary Special-purpose Plane)平面,又称为特殊用途补充平面,摆放语言标签(Language Tags)和异体字选择器(Variation Selectors),这些都是控制字符,其范围为E0000-EFFFF。
    第15辅助平面为私人使用区:补充私人使用区-A (F0000-FFFFF)- Supplementary Private Use Area-A
    第16辅助平面为私人使用区:补充私人使用区-B(100000-10FFFF)- Supplementary Private Use Area-B

    UTF-8与UTF-16:
    Unicode转UTF-8(最多4字节,BMP平面最多只使用3个字节):
    Unicode:0000 0000 - 0000 007F
    UTF-8:0xxxxxxx
    Unicode:0000 0080 - 0000 07FF
    UTF-8:110xxxxx 10xxxxxx
    Unicode:0000 0800 - 0000 FFFF
    UTF-8:1110xxxx 10xxxxxx 10xxxxxx
    Unicode:0001 0000 - 0010 FFFF
    UTF-8:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    转换时将16进制的Unicode转成2进制,按范围逐一填入上表的x中。汉字在UTF-8中,在BMP平面的需要3个字节表示,在SIP和TIP平面中使用4个字节表示。

    Unicode转UTF-16:
    Unicode BMP平面不用转换,BMP以外的平面需要使用UTF-16代理编码:
    UTF-16代理UTF-16 Surrogates (D800-DFFF)
    -高半区代理(D800-DBFF)
    -低半区代理(DC00-DFFF)
    Unicode编码的10000相当于UTF-16编码的D800 DC00从Unicode代码点到代理项对转换:
    1、获取Unicode代码点值,减去0x10000,转成20位二进制,分成两个高低代理的10位二进制
    2、高代理项10位二进制转成16进制,从高代理项加上0xD800
    3、低代理项10位二进制转成16进制,从低代理项加上0xDC00
    从代理项对到Unicode代码点转换:
    1、从高代理项减去0xD800,获取有效10位二进制
    2、从低代理项减去0xDC00,获取有效10位二进制
    3、组合成20位二进制转16进制,加上0x10000,获取Unicode代码点值

    Unicode CJK表意文字一览
    中日韩统一表意文字基本区URO(20992个码位)
    首发unicode版本:1.0.1
    发布时间:1992年6月
    范围:4E00-9FFF(BMP平面)
    字数:
    20902字(1.0.1版),1992年6月。(4E00-9FA5)
    20924字(4.1版),2005年3月31日。(4E00-9FBB),增加22字
    20932字(5.1版),2008年4月4日。(4E00-9FC3),增加8字
    20940字(5.2版),2009年10月1日。(4E00-9FCB),增加8字
    20941字(6.1版),2012年1月31日。(4E00-9FCC),增加1字
    20950字(8.0版),2015年6月17日。(4E00-9FD5),增加9字
    20971字(10.0版),2017年6月20日。(4E00-9FEA),增加21字
    20976字(11.0版),2018年6月5日。(4E00-9FEF),增加5字
    20989字(13.0版),2020年3月10日。(4E00-9FFC),增加13字
    20992字(14.0版),2021年9月14日。(4E00-9FFF),增加3字
    所有码位均用完。

    中日韩统一表意文字扩展A(6592个码位)
    首发unicode版本:3.0
    发布时间:1999年9月
    范围:3400-4DBF(BMP平面)
    字数:
    6582字(3.0版),1999年9月。(3400-4DB5)
    6592字(13.0版),2020年3月10日。(3400-4DBF),增加10字
    所有码位均用完。

    中日韩统一表意文字扩展B(42720个码位)
    首发unicode版本:3.1
    发布时间:2001年3月
    范围:20000-2A6DF(SIP平面)
    字数:
    42711字(3.1版),2001年3月。(20000-2A6D6)
    42718字(13.0版),2020年3月10日。(20000-2A6DD),增加7字
    42720字(14.0版),2021年9月14日。(20000-2A6DF),增加2字
    所有码位均用完。

    中日韩统一表意文字扩展C(4160个码位)
    首发unicode版本:5.2
    发布时间:2009年10月1日
    范围:2A700-2B73F(SIP平面)
    字数:
    4149字(5.2版),2009年10月1日。(2A700-2B734)
    4152字(14.0版),2021年9月14日。(2A700-2B738),增加4字
    剩余7个保留码位未使用。

    中日韩统一表意文字扩展D(224个码位)
    首发unicode版本:6.0
    发布时间:2010年10月11日
    范围:2B740-2B81F(SIP平面)
    字数:
    222字(6.0版),2010年10月11日。(2B740-2B81D)
    剩余2个保留码位未使用。

    中日韩统一表意文字扩展E(5776个码位)
    首发unicode版本:8.0
    发布时间:2015年6月17日
    范围:2B820-2CEAF(SIP平面)
    字数:
    5762字(8.0版),2015年6月17日。(2B820-2CEA1)
    剩余14个保留码位未使用。

    中日韩统一表意文字扩展F(7488个码位)
    首发unicode版本:10.0
    发布时间:2017年6月20日
    范围:2CEB0-2EBEF(SIP平面)
    字数:
    7473字(10.0版),2017年6月20日。(2CEB0-2EBE0)
    剩余15个保留码位未使用。

    中日韩统一表意文字扩展G(4944个码位)
    首发unicode版本:13.0
    发布时间:2020年3月10日
    范围:30000-3134F(TIP平面)
    字数:4939字(13.0版),2020年3月10日。(30000-3134A)
    剩余5个保留码位未使用。

    Unicode的PUA(Private Use Areas):
    在Unicode中, 私人使用区指其解释未在Unicode标准中指定,而是由合作用户之间的私人协议决定其用途的一系列码位。Unicode定义了三个私人使用区:一个在基本多文种平面(U+E000-U+F8FF)中,另外两个几乎包含了整个第15和第16平面(分别为U+F0000-U+FFFFD,U+100000-U+10FFFD)。私人使用区字符的分配,可不由字面意义上的私人决定;一些组织已经发布了一些分配计划。但根据其定义,私人使用区相同的代码点可被分配为不同的字符,因此用户可能因安装了某种字体,看到其显示为一种形态,但使用了其他字体的用户可能看到完全不同的字符。

    Windows系统对Unicode的字体支持:
    Windows XP:初版CJK基本区(4E00-9FA5)及GBK部分收入的扩展A
    Windows Vista:扩展B
    Windows 7:扩展B
    Windows 8:扩展D
    Windows 8.1:扩展D
    Windows 10:扩展E在《通用规范汉字表》中的108字及之前编码错位的7个字

    国标GB码收入汉字的演变简述:
    GB2312-1980:发布于1980年,共收录6763字,由区位码加上2020H得到国标码,再加上8080H,得到在计算机内部使用的机内码构成。
    GBK-1995:发布于1995年,收录了21003个汉字,收入了GB13000-1993编码中的所有汉字,BIG5编码的汉字也因此收入其中,“珺”、“瓅”等字从此进入国标码,该编码中有52个汉字在GBK发布时Unicode没有收入,比如“䶮”字,临时使用Unicode PUA编码E863表示,1999年9月后,这52个汉字在Unicode CJK扩展A收入,但现在仍然常常在GBK转Unicode编码时,会将其转成Unicode PUA临时编码,反向将Unicode CJK扩展A的编码转换到GBK时可能会转成“?”,现今可用于转换GBK编码的范围常被固定在初版基本区的范围(4E00-9FA5),CJK基本区以后固定的范围是(4E00-9FFF),类似于“䶮”字的52个GBK汉字由于在CJK扩展A内而得不到转码,最终会转成“?”。在制定GBK时,Unicode中还没有这些字符,所以使用了私用区(PUA)的码位,这80个字符的码位是0xE815-0xE864。后来,Unicode将52个汉字收录到“CJK统一汉字扩充A”。28个部首中有14个部首被收录到“CJK部首补充区”。所以,这些字符都有两个编码,一个为Unicode正式码,另一个为私用区(PUA)临时码。其中8个部首被收录到“CJK统一汉字URO+”的新增区域,即0x9FA6-0x9FFF。还有6个部首被Unicode收录到“CJK统一汉字扩充B区”。
    GB18030-2000:发布于2000年,收录了27533个汉字,将Unicode CJK 扩展A的汉字加入,扩展A的汉字非GBK部分使用4字节编码,并将此定为强制标准。该标准支持单字节、双字节、四字节编码。常用输入法均支持该标准,即初版CJK基本区+CJK扩展A。
    GB18030-2005:发布于2005年,收录了70244个汉字,将Unicode CJK 扩展B的汉字加入,扩展B的汉字使用4字节编码,扩展A部分及以下为强制标准,其余为推荐标准。该标准支持单字节、双字节、四字节编码。

    《通用规范汉字表》在CJK初版基本区外的收字:CJK初版基本区是指范围在4E00-9FA5的汉字,在1992年的Unicode1.0.1中首次发布,Unicode14.0的CJK基本区精确范围为4E00-9FFF。
    CJK基本区汉字补充:3字
    鿍鿎鿏
    CJK-A: 77字
    㑇㑊㕮㘎㙍㙘㙦㛃㛚㛹㟃㠇㠓㤘㥄㧐㧑㧟㫰㬊㬎㬚㭎㭕㮾㰀㳇㳘㳚㴔㵐㶲㸆㸌㺄㻬㽏㿠䁖䂮䃅䃎䅟䌹䎃䎖䏝䏡䏲䐃䓖䓛䓨䓫䓬䗖䗛䗪䗴䜣䝙䢺䢼䣘䥽䦃䲟䲠䲢䴓䴔䴕䴖䴗䴘䴙䶮
    CJK-B: 36字
    𠅤𠙶𠳐𡎚𡐓𣗋𣲗𣲘𣸣𤧛𤩽𤫉𥔲𥕢𥖨𥻗𦈡𦒍𦙶𦝼𦭜𦰡𧿹𨐈𨙸𨚕𨟠𨭉𨱇𨱏𨱑𨱔𨺙𩽾𩾃𩾌
    CJK-C: 44字
    𪟝𪣻𪤗𪨰𪨶𪩘𪾢𫄧𫄨𫄷𫄸𫇭𫌀𫍣𫍯𫍲𫍽𫐄𫐐𫐓𫑡𫓧𫓯𫓶𫓹𫔍𫔎𫔶𫖮𫖯𫖳𫗧𫗴𫘜𫘝𫘦𫘧𫘨𫘪𫘬𫚕𫚖𫚭𫛭
    CJK-D: 8字
    𫞩𫟅𫟦𫟹𫟼𫠆𫠊𫠜
    CJK-E: 108字
    𫢸𫫇𫭟𫭢𫭼𫮃𫰛𫵷𫶇𫷷𫸩𬀩𬀪𬂩𬃊𬇕𬇙𬇹𬉼𬊈𬊤𬌗𬍛𬍡𬍤𬒈𬒔𬒗𬕂𬘓𬘘𬘡𬘩𬘫𬘬𬘭𬘯𬙂𬙊𬙋𬜬𬜯𬞟𬟁𬟽𬣙𬣞𬣡𬣳𬤇𬤊𬤝𬨂𬨎𬩽𬪩𬬩𬬭𬬮𬬱𬬸𬬹𬬻𬬿𬭁𬭊𬭎𬭚𬭛𬭤𬭩𬭬𬭯𬭳𬭶𬭸𬭼𬮱𬮿𬯀𬯎𬱖𬱟𬳵𬳶𬳽𬳿𬴂𬴃𬴊𬶋𬶍𬶏𬶐𬶟𬶠𬶨𬶭𬶮𬷕𬸘𬸚𬸣𬸦𬸪𬹼𬺈𬺓

    字体与输入法:
    字体文件用于显示对应Unicode编码的字形,输入法则是通过输入码(拼音、五笔、语音、手写)来搜索寻找对应的Unicode编码,以字符形式插入文本,操作系统没有该编码的字体,则显示为字体指定的缺字符号。Word和写字板可通过输入16进制Unicode编码,然后同时按Alt+X键将Unicode编码转成对应的字符。

    Unicode辅助平面与GB18030转换:
    GB18030转Unicode:
    10进制转16进制(
    (GB18030第一字节的10进制-144)*12600
    +(GB18030第二字节的10进制-48)*1260
    +(GB18030第三字节的10进制-129)*10
    +(GB18030第四字节的10进制-48)
    +65536)

    Uncode转GB18030:
    A=Unicode编码(16进制)
    B=INT((16进制转10进制(A)-65536)/12600)
    C=MOD((16进制转10进制(A)-65536),12600)
    D=INT(C/1260)
    E=MOD(C,1260)
    F=INT(E/10)
    G=MOD(E,10)
    第一字节=10进制转16进制(B+144)
    第二字节=10进制转16进制(D+48)
    第三字节=10进制转16进制(F+129)
    第四字节=10进制转16进制(G+48)

    Unicode字表:
    https://www.unicode.org/charts/
    整体字表:
    https://www.unicode.org/Public/13.0.0/charts/CodeCharts.pdf

    展开全文
  • GB18030是国家规定的标准,时间是2000年,这个算是最新的标准,为了包含少数民族们使用的文字而制定的。GB18030是向下兼容GBK的。32位字符集,收录了27553个汉字。同时收录了藏文、蒙文、维吾尔文等主要的少数民族...

    作者:天一阁图书管理员

    最近使用python导数据,从一个latin1的数据库导到另一个latin1的数据库,遇到像“漩偑”这样的字符的时候简直是痛不欲生。怎么导怎么报错,如果忽略转码错误又会出现缺少字符的情况。花了几天时间才完全解决这个问题,至于是怎么解决的需要另写一篇python的文章来解释了。还是先练一下基本功吧......

    计算机一开始是只支持ascii码表的。而Latin1在ascii的基础上添加了一些字符,ascii表示的是0-126这个范围。但latin1表示的范围是0x0-0xFF。因此latin1就能表示所有的单字节字符。

    计算发展的过程中,有一段时间字符集是没有标准的,不少语言都是自己搞了一套,就像大陆和台湾使用的简繁体一样。那时候在windows上字符是使用DBCS来表示的。DBCS就是双字节字符集,使用双字节来表示字符。

    gb2312是1980年定义的规范,可想而知它有多古老了......使用16位来表示字符,收录了6763个汉字,682个字符,在那个时候,它支持的字符是有限的,也不支持繁体,当然也仅用于大陆地区,可能也被新加坡使用。

    GBK是微软制定的,1995年用于windows95上,这个也比较古老了......也是16位字符集,收录21003个汉字。扩容了很多了。GBK是向下兼容GB2312的。可以支持简繁体共存。

    GB18030是国家规定的标准,时间是2000年,这个算是最新的标准,为了包含少数民族们使用的文字而制定的。GB18030是向下兼容GBK的。32位字符集,收录了27553个汉字。同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字。 而到了这个时候,windows内核统一使用unicode了,不再是以前那种DBCS表示方式了。

    因为各个国家或者说民族都自己定义自己的字符集,给操作系统厂商和软件商还有用户带来了很大的困扰。字符集的标准化也开始了。unicode使用4字节来表示一个字符,也就是'a'这个字符也要使用32位来表示。这样的话它在理论上表示世界上所有的字符,而且不会出现冲突。每个字符都有自己独特的位置。

    unicode发布以后,迟迟得不到推广,因为它太占存储和内存了。后来硬盘和内存白菜价了以后,才慢慢被接受。而为了解决unicode占位太大的问题,出现了不同的UCS Transformation Format,就是unicode转换格式。utf-8就是其中一种,utf-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-8不是一种字符集,而是一种字符集的转换方式,用来节省空间的。

    展开全文
  • 关于UTF-8,GB2312,GB18030,Unicode区别和联系,可参考博文...

    UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:

    1字节:0xxxxxxx
    2字节:110xxxxx 10xxxxxx
    3字节:1110xxxx 10xxxxxx 10xxxxxx
    4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
     

    关于UTF-8,GB2312,GB18030,Unicode区别和联系,可参考博文http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC%8C%E4%BD%A0%E6%89%80%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84.html

    展开全文
  • GB18030兼容GBK,GBK兼容GB2312,所以GB2312可以随意转换为GBK或者GB18030不会有转换错误问题 U系列编码 Unicode系列 其实类似中国这样做法的有很多,作为ISO这样的组织其实不希望每个国家采用每个国家自己的编码...
  • 参考: 《编码标准-GB2312 GBK GB18030》 《字符编码笔记:ASCII,Unicode 和 UTF-8》 《字体编辑用中日韩汉字Unicode编码表》 《程序员趣味读物:谈谈Unicode编码》 1. 最简单的ASCII码。 ASCII码使用1个字节记录了...
  • gb18030与utf-8

    2021-03-03 11:08:52
    今天在跟着嵩天老师学习词云模块的过程中遇到了编码问题:...百度之后,发现如下两种方法:一、把编码方式utf-8 修改为gb18030二、把原来的txt文件重新打开另存为的时候,把编码方式修改为utf-8,然后代码的encod...
  • 1 GB2312-80GB 2312 或 GB 2312-80 是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称 GB 0,由中国国家标准总局发布,1981 年 5 月 1 日实施。GB 2312 编码通行于中国大陆;新加坡等...
  • 在9i中Oracle存在字符集ZHS32GB18030,而10g以后,这个字符集在安装数据库的时候已经不可选了。由于客户的环境需要输入大量的生僻字,要求客户端采用GB18030编码,这使得数据库无法使用ZHS16GBK字符集。查询了一下...
  • GB18030和UTF-8有啥区别

    2021-01-26 23:42:13
    所以说,GB18030unicode+utf-8是不同的字符表示方式,一个是中国制定的标准,一个是国际上的组织制定的标准。计算机被发明的时候,人们认为不会像现在这么流行,所以包括控制字符在内人们只定义了包括控制字符...
  • 这个问题基本弄清楚了,解释如下:首先说字符集,GBK字符集有80个字符是后来增补的,因为需要与GB18030兼容,所以放在GB18030的PUA区(此时这80个字符也在Unicode中有自己的对应的一套编码了,这一套编码在GB18030和...
  • My former boss at MySQL sent out a notice that MySQL 5.7.4 nowsupports theGB18030character set, thus responding to requests that have been appearing since2005. This is a big deal because the Chinese g...
  • (0x390xA9中0x39是高字节,0xA9是低字节) GB18030编码:但是,中国有56个民族,所以,我们再次对编码规则进行了扩展,又加了近几千个少数民族的字符,于是再次扩展后得编码叫做GB18030。 中国的程序员觉得这一系列...
  • 针对开发人员经常会遇到的字符集和编码问题,还有字符乱码问题,本文通过对字符,字符集,字符编码,对常用的GB2312、GBK、BG18030Unicode、utf-8、utf-16,还有windows记事本中常出现的ANSI、Unicode big endian...
  • java 汉字 转 gb18030

    2021-03-15 17:03:11
    java 汉字 转 gb18030[2021-01-31 12:25:57]简介:php将汉字转ascii的方法:首先创建一个php示例文件;然后通过封装好的“public function strtoascii($str){}”方法将汉字转为ascii即可。推荐:《PHP视频教程》直接...
  • GB2312的文件转为Unicode格式using System;using System.Collections.Generic;using System.Text;namespace CrmTools{class FileUtil{public static string readFile(string fileName){//return System.IO.File....
  • Java| 编码格式介绍(ANSI、GBK、GB2312、UTF-8、GB18030UNICODE) 一.编码格式介绍 编码一直是让新手头疼的问题,特别是 GBK、GB2312、UTF-8 这三个比较常见的网页编码的区别,更是让许多新手晕头转向,怎么解释...
  • 2.进入偏好设置提示框之后,切换到“打开和存储”选项,在“纯文本文件编码”中设置“打开文件”的选项,选择为“中文(GB 18030)”/utf-8,退出即可。 3.重新打开刚刚打不开的那个文本文件。 ...
  • 1.ASCLL码 ASCLL码共有128个,用一个字节(byte)的低七位表示,0到31是控制字符如换行、回车、删除等,32到126是打印字符,可以通过键盘输入并且能够显示出来。 2.ISO-8859-1 128个字符显然是不够用的,...3.GB2312
  • 目录 一、编码历史 1、问题产生 2、解决方案 3、字符集发展 二、字符集和编码方式 1、区别 2、研究工具 3、编码方式实现 i、ASCII ii、GB2312 iii、GBK iv、GB18030 v、UNICODE i、UFT-8 ii、UTF-32 iii、UTF-16 iv...
  • #define testUnicode main //Refer to ...void testUnicode() { std::wstring a = L"汉"; //code point @ 0x6c49 ,a赋值的是unicode码点 unsigned char aa[10]; .
  • GB2312与UNICODE码互转

    2021-01-15 16:21:16
    } int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen) { return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); } int u2g(char *inbuf,int inlen,char *outbuf,int outlen) { return ...
  • 即0xCF,0xDF----GB2312编码 //=========================unicode------>gb2312============================ //========================gb2312------->unicode========================== setlocale(LC_ALL,"zh_...
  • 所述GB18030字符集指GB18030-2005字符集,GB18030字符集包括双字节部分和四字节部分,其特征在于:将字符集划分为:双字节区,字符集中双字节部分的21003个汉字,对应到GBK编码、GB18030编码和Unicode编码;...
  • 计算机的数据是由1和0组成,这种数据在这里...如:ASCII和GBK,这是由于排列组合的结果* 编码间可以互相转换(通过Unicode),但可能会造成丢失逻辑信息例子:这里有两个不同的编码规则编码规则A物理数据逻辑数据100...
  • 比如,简体中文常见的编码方式是 GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 256 x 256 = 65536 个符号。 Unicode Unicode 为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 ...
  • GBK (GB2312/GB18030)\x00-\xff GBK双字节编码范围\x20-\x7f ASCII\xa1-\xff 中文\x80-\xff 中文2. UTF-8 (Unicode)\u4e00-\u9fa5 (中文)\x3130-\x318F (韩文\xAC00-\xD7A3 (韩文)\u0800-\u4e00 (日文)ps: 韩文是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,187
精华内容 31,274
关键字:

gb18030unicode