精华内容
下载资源
问答
  • 目前大部分的网站,都是使用的UTF-8编码。例如发送一段二进制到服务器时,服务器规定该二进制内容的编码...附件是GB18030包含的21004个汉字的GB18030编码、Unicode编码、URL编码对照表,可用于解决中文乱码转换恢复。
  • 常见的编码如下:国外: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 编码”是怎样的规则。

    展开全文
  • 常用字符集编码详解(ASCII GB2312 GBK GB18030 unicode UTF-8) 字符常用的编码,大家可以认识下以后就可以方便确定用什么编码了 <br />ASCII <br />ASCII码是7位编码,编码范围是0x00-0x7F。...
    
    

    字符常用的编码,大家可以认识下以后就可以方便确定用什么编码了


    ASCII


    ASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。
    只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。


    GB2312


    GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般 用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。
    区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计 3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字 是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。
    GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。
    GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
    EUC-CN可以理解为GB2312的别名,和GB2312完全相同。
    区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和ISO- 2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。


    GBK


    GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。
    GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。
    低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。
    有些系统中用0x40-0x7E中的字符(如“|”)做特殊符号,在定位这些符号时又没有判断这些符号是不是属于某个 GBK字符的低字节,这样就会造成错误判断。在支持GB2312的环境下就不存在这个问题。需要注意的是支持GBK的环境中小于0x80的某个字节未必就 是ASCII符号;另外就是最好选用小于0×40的ASCII符号做一些特殊符号,这样就可以快速定位,且不用担心是某个汉字的另一半。Big5编码中也 存在相应问题。
    CP936和GBK的有些许差别,绝大多数情况下可以把CP936当作GBK的别名。

     


    GB18030


    GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。
    GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。
    GB18030的单字节编码范围是0x00-0x7F,完全等同与ASCII;双字节编码的范围和GBK相同,高字节是0x81-0xFE,低字节的编码 范围是0x40-0x7E和0x80-FE;四字节编码中第一、三字节的编码范围是0x81-0xFE,二、四字节是0x30-0x39。
    Windows中CP936代码页使用0x80来表示欧元符号,而在GB18030编码中没有使用0x80编码位,用其他位置来表示欧元符号。这可以理解 为是GB18030向下兼容性上的一点小问题;也可以理解为0x80是CP936对GBK的扩展,而GB18030只是和GBK兼容良好。

     


    unicode


    每一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。因而人们制定了一个世界标准,叫做unicode。unicode为每个字符提供 了唯一的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就是说,它世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数值。
    Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。
    因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中, 字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在 UTF-8和ASCII中,“A”的编码都是0x41.
    UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常重要。

     


    UTF-8


    Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显 示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
    GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。
    GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
    GBK、GB2312--Unicode--UTF8
    UTF8--Unicode--GBK、GB2312

     

     

    转自:http://www.cnblogs.com/zhaozhan/archive/2010/07/15/1778475.html

     

     

     

     

    展开全文
  •  utf-8编码(1~4字节) utf-16编码(2字节) gb18030编码 (1~4字节,针对汉字的)  查看各个编码的对应的字节数的方法:  String s1="y*\n我ry";  byte[] b=s1.getBytes("GBK");  System.out.println...

     前言:我们都知道,人类能识别自己的语言(汉字,字母,标点符号),但是计算机只能识别二进制代码。我们要与计算机交互,只 要把自己的语言字符按照人类定义的规则转换成二进制代码。

     (1)人类定义的规则就是字符集,在表中,我们的人类语言符号有一个对应的唯一数字。比如ascII表中,‘a’对应的数字是97,只要把97转化二进制代码就行了。

              常见的字符集:西方国家定义(ascII   1字节)  --> 》发展到中国表中没有汉字,于是国人搞了汉字编码表(GB2312   2字节),  与此同时台湾搞                                     了个繁体字(big5) ----》于是国人右搞了一个gbk编码(把Gb2312,繁体字,一些难写的字一对应了表)-----》世界那么大,总得出去走走,但是各个国家定义的编码表不一样,一出来查看信息,比如中国人 用gbk写了一个汉字,对应在gbk中有一个数字400,数字转换成二进制代码,拿到美国去,它机器上只有自己国家的编码a.    二进制代码转换数字400. 但是在a表中却查到了一个 其他的字符。于是乱码产出了。------》为了解决这个问题,于是UNIcode字符集(默认是两个字节一个字符)产生了,对于字母  而 言,两个字节太大了,于是又产生了一个utf-8编码,根据内容长度自动变化字节,一个汉字为三个字节

              常见的编码:ascii编码(1字节)        gbk编码(asc部分,1个字节,其他的2个字节)  gb2312(asc部分,1个字节,其他的2个字节)  

                                  utf-8编码(1~4字节)    utf-16编码(2字节)  gb18030编码 (1~4字节,针对汉字的)

             查看各个编码的对应的字节数的方法:

                                  String s1="y*\n我ry";
                                  byte[] b=s1.getBytes("GBK");
                                  System.out.println(b.length);


    个人的理解:其实每个字符集默认就对应了一个编码(有的人就直接把字符集名叫成编码,也没错,但得明白到底啥意思)。所以有时候有人会说UNicode编码,但是我们知道, Unicode是一个字符集,它默认采用了一个utf-16的编码格式(2个字 节)


    展开全文
  • GB18030 编码: [CED2] Unicode 编码: [6211] utf8 编码: [6211] utf8 实际存储格式 [e68891] 中国windows的cmd默认使用gbk,代码页936 //printf输出汉字 //需要vs,文件--高级保存选项--编码,...

    【首先简单理解几种编码】

    ascii是ansi标准,包含128个字符(7 bits)
    我们说的ansi编码,通常特指windows平台的一种ascii扩展码,他将ascii码扩展到8bits,增加了0x80-0xff共128个字符。在cjk(chinese japanese korean)系统中,ansi还常常指代包括多字节内码的编码。不难看出,所谓ansi编码,就是一种未经国际标准化(也没办法标准化,因为扩展部分的内码存在交集)的兼容ascii编码的,非unicode字符集编码

    GB 2312 或 GB 2312-80 最早中国字符编码集,就是GB国标,中国国家标准简体中文字符集,约6763 个汉字,其中一级汉字 3755 个,二级汉字 3008

    GBK 即汉字内码扩展规范,就是GBK国标扩,兼容GB 2312,约 21886 个汉字和图形符号,【包含BIG5 中的全部汉字】

    BIG5 台湾、香港地区的一个繁体字编码方案

    GB 18030,最终汉字编码,与GB 2312-1980 和 GBK 兼容,共收录汉字70244个
    【搞清GB 18030,GBK,GB 2312总体关系,都是【双字节】】

    Unicode,统一码,包括世界上所有字符【双字节】,【与上面的汉字编码不兼容,不一致】

    utf8是Unicode的具体一种实现方式,【变长编码】【一个汉字占3字节,字母占一个字节】,utf8的编码就是Unicode的编码,不过会变长处理后存储

    【程序对字符编码的解释】
    字符就是一串 unsigned char[] 数组,每一个char,表示一个字节,数字0-255

    程序对字符编码的解释就是如何看待这一串unsigned char[] 数组表示的数字序列。编码只是规定数字序列表示的字符含义,程序看到的也只是具体的数字序列,

    汉字不同编码:我     []内为16进制编码
    GB2312编码:[CED2]  BIG5编码:[A7DA]  GBK编码:[CED2]   GB18030编码:[CED2]   Unicode编码:[6211] utf8编码:[6211] utf8实际存储格式[e68891]

    中国windows的cmd默认使用gbk,代码页936

    //printf输出汉字
    //需要vs,文件--高级保存选项--编码,代码页936,保证 aa是gbk编码
    #include <stdio.h>
    
    int main()
    {
        unsigned char aa[] = "我";
        unsigned char bb[] = {0xce,0xd2,'\0'};
        //查看编码
        for (int i = 0; i < strlen(aa); i++)
        {
            printf("%x\n", aa[i]);
        }
        printf("%s\n", bb);
        return 0;
    }

    cmd切换代码页

    chcp 65001  就是换成UTF-8代码页    
    
    chcp 936 可以换回默认的GBK    
    
    chcp 437 是美国英语

    显示utf8汉字

    printf输出汉字
    //需要vs,文件--高级保存选项--编码,代码页936,保证 aa是gbk编码
    #include <stdio.h>
    
    int main()
    { 
        unsigned char aa[] = "我";
        unsigned char bb[] = {0xe6,0x88,0x91,'\0'};
        //打印的还是gbk编码
        for (int i = 0; i < strlen(aa); i++)
        {
            printf("%x\n", aa[i]);
        }
        //输出utf8字符
        printf("%s\n", bb);
        return 0;
    }

    ctrl+f5 编译运行,看到gbk编码,和乱码
    新开cmd窗口

    chcp 65001
    把生成的exe拖动cmd后,回车运行,看到utf8编码汉字

    最后是unicode与utf8转换方法

    Unicode符号范围        | UTF-8编码方式
    (十六进制)             | (二进制)
    ----------------------+---------------------------------------------
          0 <--> 0x7f     | 0xxxxxxx
       0x80 <--> 0x7FF    | 110xxxxx 10xxxxxx
      0x800 <--> 0xFFFF   | 1110xxxx 10xxxxxx 10xxxxxx
    0x10000 <--> 0x10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    汉字“我”,unicode:6211,二进制:0110 0010 0001 0001【一定要补全最前面的0,一共双字节16位】
    填充到utf8编码,6211属于0x800 <--> 0xFFFF,所有需要三字节
    
    1110xxxx 10xxxxxx 10xxxxxx (规则)
        0110   001000   010001 (unicode编码,从右向左依次填充x)
    --------------------------
    11100110 10001000 10010001 (utf8实际存储编码)

    处理器大小端对字符编码的影响

    0x11223344,机器字长,一个内存地址存储的逻辑值
    存储方式:
    大端:11|22|33|44
    小端:44|33|22|11
        低地址---》高地址
    大端主要是与人看的一致
    小端主要是与值得逻辑一致(低位在低地址)

    intelcpu,是小端格式,wchar_t是双字节char

    #include <stdio.h>
    
    int main()
    {
        wchar_t *bb[] = {'a','b'};
        //bb2位数字,占4字节
        printf("%d\n", sizeof(*bb));
        只能打印出a
        printf("%s\n", bb);
        return 0;
    }

    【原因】

    机器字长32位,所有小端格式是对32位高低转换
    wchar_t 双字节 16wchar_t *bb[] = {'a','b'}  32位
    逻辑上内存结构是:00000000 01100001  00000000 01100010 (00 97 00 98 十进制ascii码)
    但是小端的存储是:01100001 00000000  01100010 00000000 (97 00 98 00 十进制ascii码)

    printf读到的是小端存储的值,所有打印了a,下个字节是0,表示字符串结束

    展开全文
  • 98五笔超全的字库,值得下载收藏,GB2312 GBK GB18030 Unicode,一劳永逸。
  • Gb2312、gbk、gb18030码位空间的约定以及计算,gbk历史回顾以及与Unicode之间的映射。gb18030各个版本的区别以及码位空间的分布以及与Unicode的映射。
  • GB18030编码研究以及GBK、GB18030Unicode的映射 GB18030有两个版本:GB18030-2000和GB18030-2005。在本文中,没有指明版本的GB18030是指GB18030-2005。本文讨论了以下问题: GB2312有682个图形符号,都放在1区...
  • GB18030Unicode码表

    2009-02-06 14:59:52
    GB18030Unicode码表,excel格式。
  • GB18030unicode之间的映射表
  • GB18030编码研究以及GBK,GB2312,GB18030Unicode的映射,乱码解决 计算机,毫无疑问是一部机器,在最初我们接触计算机时或者接收计算机教育时,我们就知道:计算机能识别的只有010101的二进制码。人与计算机交互早期...
  • 所有的汉字的GB18030UNICODE编码
  • gb18030unicode转换表

    2009-01-16 09:15:22
    gb180301 unicode 转换表
  • GB18030是国家规定的标准,时间是2000年,这个算是最新的标准,为了包含少数民族们使用的文字而制定的。GB18030是向下兼容GBK的。32位字符集,收录了27553个汉字。同时收录了藏文、蒙文、维吾尔文等主要的少数民族...
  • 在本文中,没有指明版本的GB18030是指GB18030-2005。本文讨论了以下问题: GB2312有682个图形符号,都放在1区。GBK的1区有717个图形符号,5区有 166个图形符号,一共有883个图形符号。G...
  • ANSI、GBK、GB2312、UTF-8、GB18030UNICODE
  • unicodegb18030编码

    2018-02-08 09:21:41
    这个压缩包是采用C语言书写的,可以将UTF-8编码转成Unicode编码,再转成国标GB18030编码
  • 关于UTF-8,GB2312,GB18030,Unicode区别和联系,可参考博文...
  • 关于ASCII和GB2312、GBK、GB18030UNICODE,这篇文章的讲解很有趣,读者比较容易理解。ASCII-->GB2312-->GBK-->GB18030-->UNICODE的发展历程 这里,我就大概总结下: ASCII编码 ASCII编码起源于...
  • unicodeGB18030源码

    2015-01-28 17:56:46
    mmi_chset_ucs2_to_gb18030_str
  • unicodegb18030的c代码

    2020-05-08 16:15:25
    unicode编码转gb18030编码的c代码,纯C语言实现,采用查表方式,不依赖其它外部库,可快速移植到android、linux等系统上。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,310
精华内容 524
关键字:

gb18030unicode