QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3063|回复: 0
打印 上一主题 下一主题

UNICODE编程介绍

[复制链接]
字体大小: 正常 放大
xShandow        

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-4 09:06 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<><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-&gt;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-&gt;GetBuffer(pFileName-&gt;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-&gt;settings-&gt;C/C++的属性页中的Preprocessor中写入_UNICODE,然后在link属性页中Category中选择output,在Entry-Point symbol 中添加wWinMainCRTStartup,这样,我们的UNICODE工程便大功告成。</FONT></P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-10-23 09:02 , Processed in 1.374329 second(s), 52 queries .

回顶部