|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。$ z$ w! q& }, ]! y2 \
' o5 c4 r: W9 _; B' U$ r
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:- _! f7 J9 ~; b) C k5 W: D
/ `9 l6 V3 Y8 C# _: v9 x& h/ [ WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
1 O) F* w! {- C* w% l0 h* Y+ y* o9 i2 Q
WCHAR strB [ 2 ] = { '中' , 0 } ;
, f; p. a8 b6 h6 v
- p6 W7 \: Y0 c$ f9 W CString strC ;( q! O% x9 F" c2 ?! y4 A
6 J+ ]0 y7 D' d0 D- D4 C4 u
strC+ = ( ( char * ) strB ) [ 1 ] ;
% k8 Z0 f# E4 a8 a& t; _* @2 |2 Q4 g/ n6 F; b) ?
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
) f* F7 l4 [$ ]$ J$ y5 D) h; Q7 l$ v w! H: g
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。, [ J7 E0 e% m( b$ U( P0 X
$ }: n. ~" R- ]6 d& C+ E4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:6 @6 S" z2 \5 [& c x& L% e; S
z9 E$ x' l% m* U3 ^ CString strD = ”asdf”; Y! I4 E1 ]! S- @1 _, M- t! s
4 b6 n6 ^5 T. l6 C
BSTR strD = strC.AllocSysString( ) ;
5 v+ ^1 c. I% V$ u( m7 E7 X2 r9 }: W
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
" g* L/ a0 ]9 f* v
/ F) R$ c, E8 z" o4 F4:UTF-8码转换为一般的字符串:
# w" c I3 G" D( _& F4 x
2 P d/ w" P/ d3 i#include " Windows.h "
7 ?/ q7 Y' W0 y& F8 V
" Q$ ?2 Q* x6 ]( L8 P/ y 4 X2 ]9 Y. m1 O. c# R$ J% l
; Y1 v( z. y W) r# aint main(void)) T- e) n/ w. l
; m7 [" h4 R1 Q' d( B
{. _" `- y: A3 y, g
6 d. w# l- _* H0 z6 \8 d4 w char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
7 ?( m4 z! T2 K# _
- o/ Z' X# d- m) } ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
0 {( h8 R& V. ]: [* m( x' U
; z0 Z& t4 S# U6 ]2 T WCHAR* strA;3 {( T; N# Y; e
; d7 O* r3 q+ C* i' H
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
6 `2 _9 @8 E6 b" J' O8 q$ F' H$ w0 h; k/ S. [# T/ Z0 @! T
strA = new WCHAR;; i: o' W: f3 U1 `( W2 a
4 Z9 e3 U. {) b; S2 ^
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
, C. A C2 ]2 E. ?7 ~) m
+ k; i! @8 s! I$ m/ ~: I i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
$ W6 `: h9 V% `9 _- s2 `& o/ D$ G3 |3 w9 F' d5 J3 X
char *strB=new char;
& F% p: N/ b2 ^( B! H
. n- w. q) ^4 P6 e! X WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
4 w) k8 n. o. @- _. L2 p
( a7 }: |" Q3 C" c' i5 E+ _//strB即为所求
6 l: C+ D% q) G4 U! I7 w3 ]( m' U. {, A+ T6 r$ }
delete []strA;
3 j4 u2 G9 h- Y
6 Z7 N6 _4 E3 s6 r' e delete []strB;$ H. ]2 D/ ~2 ^* V7 {+ B8 [9 N- Q
4 W2 W4 C- I* d2 ^ G- c return 0;
( ^1 F* a7 \. @( ^( i6 U' i
- S% Y9 u F! E- [" }! H& O$ m}
/ J- A! t, p! S8 r3 u& q
- X1 @. B7 P" i0 h: K) V( Q% \9 t5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
3 l1 W% J( m. U ^6 M! S6 G3 h" E
+ _! \8 T( r( g) K- u, x' J9 f5 }#include <comdef.h>
8 l, q" [& R3 b$ t: o$ {, p0 |3 E6 v# `7 j( J+ J% e3 a- K
_bstr_t strA;$ b2 T9 v6 U6 j* s
" w4 H4 l! X8 j1 ~9 X char *strB="中国人";" ]5 t3 G0 o3 g4 x
+ J7 _! Z o% v' V r8 g strA=strB;- k- d" O! ~' \- p9 h2 F- v
$ d4 |$ e6 q) j( V6 |5 n4 F WCHAR *strC=strA;4 ~$ a b |5 ~7 o* T' Z1 a5 z
) _& |: C, y& u" ]0 N long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
+ B$ g& c7 |7 U9 s
$ W c2 M' g9 Q4 J# q# t" y$ B char *strD=strA;
& V" ~2 U- ~8 ?1 _2 \7 j) A3 n7 s; H+ j9 H9 T
return 0; |
|