• 关于DBCS,MBCS和Unicode


    在欧美地区,字符串被当作一系列以 0 结尾的单字节字符,这非常自然。使用strlen函数时,会返回一个以0结尾的单字节字符数组中的字符数。

    但有些语言,比如汉字或日文,字符集的符号很多,而单字节字符集最多只能提供256个字符,这是远远不够的。因此,

    创立了双字节字符集DBCS(Double-byte charater set)来支持这些语言。

    在双字节字符集中,字符串中的每个字符由1或2个字节组成。因此也叫做多字节字符集MBCS(Multibyte charecter set)。

    对于日文中的汉字,有些字符是1字节宽,而有些是2字节宽,这使得操作多字节字符串变得非常麻烦,使用strlen操作多字节字符串不能得到字符串的真正长度,而只能得到字符串的字节数。

         ANSI的C 运行时库中没有支持多字节字符集的函数。

         VC++运行库包含有支持操作多字节字符串的函数,这些函数都以 _mb开头,比如: _mbstllen

         为了更方便的支持软件的国际化,一些国际著名的公司指定了宽字节字符集标准——Unicode。该标准最早由Apple 和Xerox公司在 198年创立,为发展和促进这一标准,1991年创建了Unicode 联盟,成员包括Adobe, Aldus, Apple, Borland, Digital,IBM 等公司。

         Unicode 这个名称来自三个主要特征:

              通用(universal)--它解决了世界语言的需要;

              统一(uniform)——它为了保证效率而使用固定长度的代码;

              唯一(unique)——字符代码的重复降到了最低点。

         Unicode 字符串中的所有字符都是16位的(2个字节),可以表示65536 个字符,这使得可对世界上所有的书面语言字符进行编码。

    摘自《Vc++编程深入引导》第15章 unicode

    资源:

    MSDN: WideCharToMultiByte,MultiByteToWideChar,及Unicode and Character Set Reference

    例子:

    Looking Up a User's Full Name

    #include <windows.h>
    #include <lm.h>
    #include <stdio.h>

    BOOL GetFullName( char *UserName, char *Domain, char *dest )
    {
        WCHAR wszUserName[UNLEN+1];          // Unicode user name
        WCHAR wszDomain[256];
        LPBYTE ComputerName;

        struct _SERVER_INFO_100 *si100;  // Server structure
        struct _USER_INFO_2 *ui;         // User structure

    // Convert ANSI user name and domain to Unicode

        MultiByteToWideChar( CP_ACP, 0, UserName,
            strlen(UserName)+1, wszUserName,  
         sizeof(wszUserName)/sizeof(wszUserName[0]) );
        MultiByteToWideChar( CP_ACP, 0, Domain,
            strlen(Domain)+1, wszDomain, sizeof(wszDomain)/sizeof(wszDomain[0]) );

    // Get the computer name of a DC for the domain.

        NetGetDCName( NULL, wszDomain, &ComputerName );

    // Look up the user on the DC.

        if( NetUserGetInfo( (LPWSTR) ComputerName,
            (LPWSTR) &wszUserName, 2, (LPBYTE *) &ui ) )
        {
            printf( "Error getting user information.\n" );
            return( FALSE );
        }

    // Convert the Unicode full name to ANSI.

        WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name, -1,
            dest, 256, NULL, NULL );

        return (TRUE);
    }

    我的例子

       CHAR szString[200];

       LPSTR pBuffer = szString;
       int strSize ;
       strSize = WideCharToMultiByte(CP_ACP,WC_NO_BEST_FIT_CHARS,strAllValue,strAllValue.GetLength(),
                pBuffer,strAllValue.GetLength(),NULL,NULL);

  • 相关阅读:
    第01组 每周小结(2/3)(组长)
    第01组 每周小结 (1/3)(组长)
    第01组 Beta冲刺 总结(组长)
    第01组Beta冲刺(5/5)(组长)
    第01组Beta冲刺(4/5)(组长)
    第01组Beta冲刺(3/5)(组长)
    第01组Beta冲刺(2/5)(组长)
    第01组Beta冲刺(1/5)(组长)
    软工实践个人总结
    每周小结(3/3)
  • 原文地址:https://www.cnblogs.com/finema/p/1399123.html
Copyright © 2020-2023  润新知