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