• MBCS与Unicode码


    MBCS(多字节码)
    早在Windows采用Unicode统一编码进行语言管理之前,Windows为了能够进行非ANSI标准字符的输出,于是采用两个字节来表示这些语言文字。因为这些双字节文字和ANSI是混和在一起的,为了加以区别,Windows将这些字符的最高位置为1(即这些双字节文字的每个字节都>=127),所以这种表示法可以表示 127x127 约一万多种非ANSI文字,其本上可以表示任何一种语言的常用文字了。于是,Windows为每一个区域版本,都制定了分别独立的文字编码,这就是MBCS(多字节码)。

    Unicode统一码万国码单一码
    是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
    在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32
    UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
      Unicode编码(16进制) ║ UTF-8 字节流(二进制)
      000000 - 00007F ║ 0xxxxxxx
      000080 - 0007FF ║ 110xxxxx 10xxxxxx
      000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
      010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
      UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
      例1:“汉”字的Unicode编码是0x6C49。0x6C49在 0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

    L""表示Unicode字符(请切记:WCHAR即ushort只表示宽字符,而宽字符并不就是unicode,反而Unicode属于宽字符).
    我们可以使用%S等进行转换MBCS/Unicode转换


    setlocale(LC_ALL,"");
    TCHAR  sxStr1[]     TEXT("12汉字");//根据平台自动选择字符集 
    char   szStr2[]     "12汉字";  //MBCS码
    WCHAR  swzStr3[]     L"12汉字"; //UNICODE码

    printf("%d,%d\n",sizeof("abc"),sizeof(L"abc"));

    printf("//depend on platform\n");
    _tprintf(TEXT("_tcsclen(\"%s\")=%d,sizeof(\"%s\")=%d\n"),sxStr1,_tcsclen(sxStr1),sxStr1,sizeof(sxStr1));
    strPrt0X(sxStr1,10);

    printf("//MBCS\n");
    printf("strlen(\"%s\")=%d,sizeof(\"%s\")=%d\n",szStr2,strlen(szStr2),szStr2,sizeof(szStr2));
    strPrt0X(szStr2,10);

    printf("//MBCS\n");
    printf("_mbstrlen(\"%S\")=%d,sizeof(\"%s\")=%d\n",swzStr3,_mbstrlen(szStr2),szStr2,sizeof(szStr2));
    strPrt0X(szStr2,10);

    printf("//Unicode\n");
    wprintf(L"wcslen(\"%S\")=%d,sizeof(\"%s\")=%d\n",szStr2,wcslen(swzStr3),swzStr3,sizeof(swzStr3));
    strPrt0X(swzStr3,10);

    #在工程设置为"Unicode字符集"时候
    4,8
    //depend on platform
    _tcsclen("12汉字")= 4,sizeof("12汉字")=10
    31 00 32 00 49 6c 57 5b
    //MBCS
    strlen("12汉字")=   6,sizeof("12汉字")=7
    31 32 ffffffba ffffffba ffffffd7 ffffffd6
    //MBCS
    _mbstrlen("12汉字")=4,sizeof("12汉字")=7
    31 32 ffffffba ffffffba ffffffd7 ffffffd6
    //Unicode
    wcslen("12汉字")=   4,sizeof("12汉字")=10
    31 00 32 00 49 6c 57 5b

    #在工程设置为"未设置"时候
    4,8
    //depend on platform
    _tcsclen("12汉字")= 6,sizeof("12汉字")=7
    31 32 ffffffba ffffffba ffffffd7 ffffffd6
    //MBCS
    strlen("12汉字")=   6,sizeof("12汉字")=7
    31 32 ffffffba ffffffba ffffffd7 ffffffd6
    //MBCS
    _mbstrlen("12汉字")=4,sizeof("12汉字")=7
    31 32 ffffffba ffffffba ffffffd7 ffffffd6
    //Unicode
    wcslen("12汉字")=   4,sizeof("12汉字")=10
    31 00 32 00 49 6c 57 5b 00 00

    (转自http://blog.sina.com.cn/s/blog_60d705b10100g12u.html)

  • 相关阅读:
    边学边收 代码
    VS2013无法链接到TFS (转)
    使用Spring MVC创建 REST API
    zookeeper的概念和基础
    使用Spring的HttpInvoker
    使用远程服务
    Spring MVC起步
    使用注解创建切面
    通过切点来选择连接点
    Spring实战之切面编程
  • 原文地址:https://www.cnblogs.com/Fightingbirds/p/2839898.html
Copyright © 2020-2023  润新知