QQ登录

只需要一步,快速开始

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

UNICODE编程介绍

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

43

主题

1

听众

385

积分

升级  28.33%

该用户从未签到

国际赛参赛者

新人进步奖

跳转到指定楼层
1#
发表于 2004-6-4 09:06 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<><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-&gt;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-&gt;GetBuffer(pFileName-&gt;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-&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-4-20 09:55 , Processed in 0.291567 second(s), 52 queries .

回顶部