关于DBCS,MBCS和Unicode

本文介绍了字符集的基本概念,探讨了单字节字符集(DBCS)与多字节字符集(MBCS)的区别,并深入讲解了Unicode标准的三大特点:通用性、统一性和唯一性。此外,还提供了在VC++中实现字符集转换的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在欧美地区,字符串被当作一系列以 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);

 

 

 

 

转载于:https://www.cnblogs.com/finema/archive/2009/02/26/1399123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值