Welcome

首页 / 软件开发 / C++ / 宽字符标量L"xx"在VC 6.0/7.0和GNU g++中的不同实现

宽字符标量L"xx"在VC 6.0/7.0和GNU g++中的不同实现2011-04-22 vckbase 乾坤一笑锲子:本文源于在 VCKBASE C++ 论坛和周星星大哥的一番讨论,这才使我追根索源,找 到了理论依据和实践的证明。(本文一些资料和测试代码由周星星提供)

《The C++ Programming Language 3rd》中有这么两段话:

from 4.3:

A type wchar_t is provided to hold characters of a larger character set such as Unicode. It is a distinct type. The size of wchar_t is implementation-defined and large enough to hold the largest character set supported by the implementation’s locale (see §21.7, §C.3.3). The strange name is a leftover from C. In C, wchar_t is a typedef (§4.9.7) rather than a builtin type. The suffix _ t was added to distinguish standard typedefs.

from 4.3.1:

Wide character literals are of the form L′ab′, where the number of characters between the quotes and their meanings is implementation-defined to match the wchar_t type. A wide character literal has type wchar_t.

这两段话中有两个要 点是我们关心的:

wchar_t 的长度是由实现决定的;

L"ab" 的含义是由实 现决定的。

那么GNU g++和VC6.0/7.0各是怎么实现的呢?看下面代码:

//author: **.Zhou
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void prt( const void* padd, size_t n )
{
const unsigned char* p = static_cast<const unsigned char*>( padd );
const unsigned char* pe = p + n;
for( ; p<pe; ++p ) printf( " %02X", *p ); printf( " " );
}
int main()
{
char a[] = "VC知识库";
wchar_t b[] = L"VC知识库";
prt( a, sizeof(a) );
prt( b, sizeof(b) );
system( "Pause" );
// 说明:
// Dev-CPP4990 显示为:
// 56 43 D6 AA CA B6 BF E2 00
// 56 00 43 00 D6 00 AA 00 CA 00 B6 00 BF 00 E2 00 00 00
// VC++6.0 和 VC.net2003 显示为:
// 56 43 D6 AA CA B6 BF E2 00
// 56 00 43 00 E5 77 C6 8B 93 5E 00 00
// 可见,Dev-CPP中的L""不是 unicode编码,只是简单的扩充,汉字需要4bytes存储

HWND h = FindWindow( NULL, "计算器" );
SetWindowTextA( h, a );
system( "Pause" );
SetWindowTextW( h, b );
system( "Pause" );
// 说明:
// VC++6.0 和 VC.net2003 都能 成功将标题改为"VC知识库"
// 而 Dev-CPP4990 只有 SetWindowTextA 显示正确,而 SetWindowTextW 显示的是乱码
}