字符集及编码

一 ASCII字符集及本地化

    ASCII(American Standard Code for Information Interchange)使用一个字节表示英语世界内的常用符号。其中,0到32状态表示一些控制字符,33到127状态表示标点,数字,字母等。

              (来自 www.asciitable.com)

 

    后来,ASCII扩展了128到255状态形成扩展ASCII,加入了一些特殊字符。一般情况下,最常使用的就是ASCII的0到127状态。

    当需要表示象形文字时,一个字节已经无法完成编码。针对简体中文,出现了GB2312编码,该编码规则如下:

    1)针对ASCII码0到127状态;

    2)取消ASCII码扩展部分,使用扩展部分(0XA1-0XF7)与下一个字节高四位(0XA1-0XFE)组合表示汉字,则可表示大约七八千简体汉字。

         这部分编码也重复包括了一些数学符号,标点符号等,即全角字符。而ASCII码中符号被称为半角字符。

     GB2312后面还进行了一些扩展,但针对简体中文本地化编码中,通常使用GB2312编码。繁体中文使用BIG5编码。到目前为止,针对ASCII即其之上的扩展(如GB2312),编码与字符集可以视为等同的。

 

二 UNICODE字符集

    使用ASCII字符集及本地化解决方案(如GB2312,BIG5等),可以在计算机上使用不同语言。但在跨语言交流中,需要一个统一的编码方式,这就是UNICODE字符集(Universal Multiple-Octet Coded Character Set),其基本规则如下:

    1)使用两个字节表示字符;

    2)对ASCII字符直接一个字节补零扩展到两个字节;

    3)使用其他状态表示世界上其他语言字符。

    UNICODE字符集可以被多种方式编码,其中,字符集定义就是一种编码方式。在VS开发环境中,将字符集选择为:Use Unicode Character Set,编译器使用 UNICODE _UNICODE选项,这直接导致TCHAR被定义为wchar_t,系统按UNICODE字符规则使用两个字节表示一个字符。当字符集选择为:Use Multi-Byte Character Set,编译器使用 _MBCS 选项,TCHAR被定义为char,系统使用ASCII字符集及本地化解释字符。

    UNICODE可以使用不同方式编码,包括UTF8, UTF16等,在网络上一般使用UTF8作为UNICODE编码实现,基本规则如下:

    1)对UNICODE前127个字符,使用一个字节编码;

    2)对剩下的字符,针对不同区间,使用2,3,4个字节编码,其中每个字节开始插入10,110,1110,11110等;

     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

 

三 字符集间转换

     在编程应用中,windows提供了不同字符集间转换函数,如下:

      MultiByteToWideChar:将多字节转换为UNICODE字符集定义编码,其中多字节包括:1)ASCII字符集及本地化;2)UTF8(UNICODE变长编码方案)等。

      WideCharToMultiByte:将UNICODE字符集定义编码转换为多字节编码,多字节定义如上。

      

 1     char* str_ascii = "";   // ASCII扩展,简体中文中为GB2312
 2     wchar_t str_ucs[260];
 3     char str_utf8[260];
 4     memset(str_ucs, 0, 260* sizeof(wchar_t));
 5     memset(str_utf8, 0, 260);
 6 
 7     // GB2312编码转换成unicode字符集
 8     int len = MultiByteToWideChar(CP_ACP, 0, str_ascii, strlen(str_ascii), str_ucs, sizeof(str_ucs));
 9 
10     // unicode字符集转换为utf8编码
11     int len2 = WideCharToMultiByte(CP_UTF8, 0, str_ucs, wcslen(str_ucs), str_utf8, sizeof(str_utf8), NULL, NULL);
12 
13     // utf8编码转换为unicode字符集
14     int len3 = MultiByteToWideChar(CP_UTF8, 0, str_utf8, strlen(str_utf8), str_ucs, sizeof(str_ucs));

 

转载于:https://www.cnblogs.com/luofeiju/p/11474919.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值