• 关于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);

  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/finema/p/1399123.html
Copyright © 2020-2023  润新知