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

 

 

 

 

posted @ 2009-02-26 22:32  finema  阅读(1013)  评论(0编辑  收藏  举报