- 在线时间
- 0 小时
- 最后登录
- 2005-9-21
- 注册时间
- 2004-4-27
- 听众数
- 1
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1027 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 385
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 153
- 主题
- 43
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   28.33% 该用户从未签到
国际赛参赛者
 |
< ><FONT face=宋体>这是一个许多人(包括我自己)曾经或至今仍疑惑的问题(这里我们只讨论UTF-16,即双字节版本)。+ _4 }8 y5 n4 u
6 ~, Q1 L$ A7 ~2 r$ T; E$ ~1.关于UNICODE9 p- N) W4 O( D7 p& P% X
首先,UNICODE主要使用的字符类型是WCHAR,定义是unsigned short。从定义我们可以看出这是一个双字节的类型,就是每一个字符占2个字节。这样的话,可以表示的字符类型就可以多达6万多。所有之前的ASCII码分布在0x0000-0x00ff之间,而汉字(包括big5)分布在0x4e00到0x9fff之间。整个unicode包含了几乎世界上所有的文字。关于UNICODE的细节,可以参看以下网页: Q7 o" t* q& ^
<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>, p! x* J: y5 ] n0 q- J4 `7 |
# e- e4 n7 l) | A/ ?2.为什么要使用UNICODE
3 c! Y0 w2 k$ Z# v 1) COM:在COM规范中,明确指定了必须使用UNICODE类型,这正是微软充分考虑了跨平台的结果。这也是为什么经常在COM中可以看到BSTR(WCHAR*)类型
% w, {5 \( p+ S6 x) ^* l6 m6 Z+ i% a( w, ^* R! M3 j+ q
2)WIN2000和WINNT:在这两个平台中,默认的字符处理方式是UNICODE。即使你写了一个非UNICODE(multibyte)的程序,系统在执行的时候仍然会对你的字符进行一次转换,这样无疑浪费了CPU时间,使用UNICODE可以有效的提高程序的运行效率(仅使用于这两个平台)。当然将来的XP也会如此。
' _' C7 o6 \0 k& j
; x5 W0 l$ n" k 3)通用性:使用UNICODE可以使我们不在为汉字和英文字符的判断而烦恼(都是2个字节)。
# o+ M o, q1 j9 Y/ x. k; M
) C. P6 Y+ d, H0 o* o2 ?3.如何使用UNICODE " Z$ @+ K0 ?# W* T8 e
1)首先推荐的类型是TCHAR(通用字符类型)。当你定义了_UNICODE宏的时候,TCHAR就是WCHAR,当你没有定义这个宏的时候,TCHAR就是char,很不可思议吧,我们可以来看一下TCHAR的定义:
' z1 }0 w0 N# J; ]# E4 J- x
1 t+ ~& k0 w9 [7 b: R# u#ifdef UNICODE // r_winnt3 P- V. o- r; @+ y( _' c
typedef WCHAR TCHAR, *PTCHAR;& z. A* y& W* C3 H! x
#else /* UNICODE */ // r_winnt
4 I5 P1 n/ R% d- g8 btypedef char TCHAR, *PTCHAR;
Z6 @2 T3 L. N& T6 Q. u" h#endif /* !_TCHAR_DEFINED */7 N0 \5 z6 Z- q/ T0 m$ j5 t
( L! d1 Q/ m7 N3 r, l上面的代码来自WINNT.H,我剔除了一些无关的部分。$ U8 f/ u6 C; M' H
现在一切都显而易见了。
' Q+ b$ I% t) y# t通过TCHAR,我们只需要这样一段代码:
3 Q( [( s0 R- L& @& X z CTCHAR tStr[] = _T("t code");! R! ^( E( d- M
MessageBox(tStr);$ P! O( f' D% q/ M; U5 z1 p
就可以支持UNICODE和MULTIBYTE两种版本。_T宏的作用就是转换成TCHAR。. J+ |4 \ {9 h7 X$ n" M( S1 ?: I J
; K! g: u' E5 S$ M3 p! c" {2)关于其他的处理
D N1 f G& l- Z- S首先是常用的CString,它本身就支持UNICODE。下面的例子说明了用法:
w& J; x4 \; I) d+ l8 D* N! F8 B7 k H1 s4 ^; S, u% H; p
CString *pFileName = new CString("c:\\tmpfile.txt");
6 j9 N/ N& T' E6 A4 ?: s, \+ J+ [& j
* q f: z2 n2 I5 |3 s#ifdef _UNICODE7 a* k; K; T9 l( V5 o' ]6 z
6 h7 y t9 a; K! \( q/ Ym_hFile = CreateFile(pFileName->AllocSysString(), ( ^# C& n* Q) i/ Y& O
GENERIC_READ | GENERIC_WRITE,
) k& }* n0 b# I% P7 {( ?* gFILE_SHARE_READ,
+ |, i$ H7 e0 Z g9 NNULL,
- p5 I0 z5 u: _ ~* Z/ [OPEN_EXISTING,& J9 K; ]5 P; |4 ?5 P) s! u
FILE_ATTRIBUTE_NORMAL,
: ]# H: |/ N O' gNULL);+ X' q* ?2 |/ q$ A$ b
#else$ D2 @! B) s' k. {
m_hFile = CreateFile(pFileName->GetBuffer(pFileName->GetLength()), 7 a6 X/ T, B6 f1 [& w
GENERIC_READ | GENERIC_WRITE,
/ I( j* ~# t, l: `! g& tFILE_SHARE_READ,
$ z! `8 w5 {) i2 O) tNULL,1 P' P5 ~- \4 H' K$ G. q$ G3 D
OPEN_EXISTING,
. W; K- o- C' a2 yFILE_ATTRIBUTE_NORMAL,
1 I: v, y" B! V+ ]/ P4 ]2 _NULL);
% O: O' K S- E( n( ^ g* _#endif0 y3 D5 Y" _3 ^" v7 ~- h L
' q/ r+ g* b$ E* J; t% g3) 当我们在UNICODE方式中需要为一个字串常量赋值时可以使用L宏,如:
2 |& ]( b4 J1 ?BSTR wcsStr = L"unicode";; V9 [( U3 T( y8 F5 v0 Y
这样的附值很简便,但是,经过L宏处理后的字串一定是UNICODE,如果你把它赋给一个MULTIBYTE的字串,字符将可能会被截断。
0 b# ]# L5 u% K( e8 ?, ^# r& Z# a4 ?8 ~! q% M( _
另外,VC还提供了一些函数如WideCharToMultiByte和MultiByteToWideChar还有另外的一些宏来支持转换。大家可以看MSDN。
7 J$ z1 s$ w% ^2 k. m$ {; V3 s( g, w' S$ ^# `
' s. w1 T& I& g
3.编译器的设置:" E) T8 \3 r( F1 k( j9 ]/ k. r/ m
首先我们需要在project->settings->C/C++的属性页中的Preprocessor中写入_UNICODE,然后在link属性页中Category中选择output,在Entry-Point symbol 中添加wWinMainCRTStartup,这样,我们的UNICODE工程便大功告成。</FONT></P> |
zan
|