<><FONT face=宋体>这是一个许多人(包括我自己)曾经或至今仍疑惑的问题(这里我们只讨论UTF-16,即双字节版本)。# a* A8 z8 ?& G% R! a5 s( u6 t: H# X I
# u1 E1 l; K* V3 d
1.关于UNICODE M3 D3 V- k+ m' n b
首先,UNICODE主要使用的字符类型是WCHAR,定义是unsigned short。从定义我们可以看出这是一个双字节的类型,就是每一个字符占2个字节。这样的话,可以表示的字符类型就可以多达6万多。所有之前的ASCII码分布在0x0000-0x00ff之间,而汉字(包括big5)分布在0x4e00到0x9fff之间。整个unicode包含了几乎世界上所有的文字。关于UNICODE的细节,可以参看以下网页& T6 ?& U& \) {' }$ R, s
<a href="http://www.unicode.org/unicode/standard/translations/s-chinese.html" target="_blank" >http://www.unicode.org/unicode/standard/translations/s-chinese.html</A><a href="http://www.unicode.org/unicode/standard/translations/s-chinese.html" target="_blank" ><FONT color=#000020></FONT></A>+ N" q$ \0 G' d$ C
% }$ G- v- k/ ^- ?8 P
2.为什么要使用UNICODE! a. \/ G+ f1 X H* o6 ~' e q! c
1) COM:在COM规范中,明确指定了必须使用UNICODE类型,这正是微软充分考虑了跨平台的结果。这也是为什么经常在COM中可以看到BSTR(WCHAR*)类型 + Z2 F$ m2 K- ] d m$ ~ I! d; u4 l. _. J1 |+ |7 G
2)WIN2000和WINNT:在这两个平台中,默认的字符处理方式是UNICODE。即使你写了一个非UNICODE(multibyte)的程序,系统在执行的时候仍然会对你的字符进行一次转换,这样无疑浪费了CPU时间,使用UNICODE可以有效的提高程序的运行效率(仅使用于这两个平台)。当然将来的XP也会如此。5 C4 H! ^& ~- N5 l8 y/ W6 Z
0 @) e2 y) j" K& `: a. Z
3)通用性:使用UNICODE可以使我们不在为汉字和英文字符的判断而烦恼(都是2个字节)。 / ?# z/ f' z& Z# m5 x1 }3 ^( I6 h x* `% D+ A; c, T- u
3.如何使用UNICODE . ]. R* w/ J p 1)首先推荐的类型是TCHAR(通用字符类型)。当你定义了_UNICODE宏的时候,TCHAR就是WCHAR,当你没有定义这个宏的时候,TCHAR就是char,很不可思议吧,我们可以来看一下TCHAR的定义: 2 ^) f0 n @/ W- X @4 @: ^; G' J! a. Q( w- h6 K" i! h
#ifdef UNICODE // r_winnt & _+ o1 g& w9 `, E7 ~4 y4 y vtypedef WCHAR TCHAR, *PTCHAR;8 f; f8 ? ?' H& w [- d3 t
#else /* UNICODE */ // r_winnt. m7 V8 k% w/ h M& J- I9 m; c+ d8 v
typedef char TCHAR, *PTCHAR; ( D( r0 B5 b" z4 j. V5 K4 k, \#endif /* !_TCHAR_DEFINED *// |% [4 @* @" Q9 z$ b* q
3 N5 X$ c. [5 C+ ?& L, t E
上面的代码来自WINNT.H,我剔除了一些无关的部分。 ( X/ A+ v" b3 r$ j现在一切都显而易见了。 : V& p: h( P; Z# X [" I7 D通过TCHAR,我们只需要这样一段代码: " m& F, u2 {, g* W9 JTCHAR tStr[] = _T("t code"); - k$ _7 ?- m0 c! ]( v- oMessageBox(tStr); / _; R( O' B# A6 }2 S8 a6 a就可以支持UNICODE和MULTIBYTE两种版本。_T宏的作用就是转换成TCHAR。" q3 m8 K! @$ x' a$ N6 H/ S( e" l
! U' X: H- X$ I4 w. w
2)关于其他的处理 4 d" d# a# o/ K$ o* `首先是常用的CString,它本身就支持UNICODE。下面的例子说明了用法: : @5 h/ {# B* y. _- u" Z- q( L. H% C; l+ v3 [, v
CString *pFileName = new CString("c:\\tmpfile.txt");. F/ j" ^% n/ G3 J
' m, Y6 [+ n4 P4 |4 c3 M. s) z- b
#ifdef _UNICODE& [0 A( J2 u! x! v2 M2 N- w( x$ h. `
) X o. Q$ ~2 u$ u0 a/ Q
m_hFile = CreateFile(pFileName->AllocSysString(), 0 _8 }0 L$ m JGENERIC_READ | GENERIC_WRITE, : g a1 M9 L4 {% E) |
FILE_SHARE_READ,5 }! N- V u$ b4 \* R# Y
NULL, 9 a7 n5 s2 h7 Q- t3 Z3 gOPEN_EXISTING,3 n' j3 ]5 _: z4 N4 D
FILE_ATTRIBUTE_NORMAL, 8 V4 _6 Z3 R R* D% @! p5 B, JNULL); ; B6 y. H* X# k# v2 J#else5 u3 x3 ]( ~& w/ C% \6 v, M
m_hFile = CreateFile(pFileName->GetBuffer(pFileName->GetLength()), 3 u6 g( c& p9 t8 H7 Y: k5 R5 M$ oGENERIC_READ | GENERIC_WRITE, ; ]" d* k: W* s7 ZFILE_SHARE_READ,) {' D7 |9 n5 }2 J: A
NULL,) S4 P- ^+ G) M3 \- Y! Q: A% b$ V+ {
OPEN_EXISTING, . R( {- }5 }/ t8 J% d( {1 RFILE_ATTRIBUTE_NORMAL, ( w3 q& J8 a$ g( |9 ?; ~NULL);9 X$ i) W( \5 s" F! V$ ^8 e T0 ?: o
#endif . e- Y4 ~' S5 ~0 s/ ? % i% [" P* l3 a, ^; G3) 当我们在UNICODE方式中需要为一个字串常量赋值时可以使用L宏,如: * n$ @4 h9 @7 f4 hBSTR wcsStr = L"unicode";& d( N' v8 z2 A9 \8 V, B
这样的附值很简便,但是,经过L宏处理后的字串一定是UNICODE,如果你把它赋给一个MULTIBYTE的字串,字符将可能会被截断。 ! F% Q& K/ o) b 5 x7 Y9 Z7 r' q# N. L% e 另外,VC还提供了一些函数如WideCharToMultiByte和MultiByteToWideChar还有另外的一些宏来支持转换。大家可以看MSDN。 ; d6 X L# h6 e* S) }: r {5 q
r( \5 @8 e5 I$ z! D# {
, b" U h( |! n1 Z L3.编译器的设置:3 P% F. J7 n& K& |% e* g4 J
首先我们需要在project->settings->C/C++的属性页中的Preprocessor中写入_UNICODE,然后在link属性页中Category中选择output,在Entry-Point symbol 中添加wWinMainCRTStartup,这样,我们的UNICODE工程便大功告成。</FONT></P>