|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。0 Q. x0 ] ^5 i" @* @+ k
( C4 S% q" o8 w$ ?% z+ _$ Q2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
% _) c5 {! _8 s$ X
! Y' _7 t/ p; Y/ j+ e WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
! e6 |- `$ g1 F9 Y2 R
4 t& V7 Q3 E* h$ I( a# a- ` WCHAR strB [ 2 ] = { '中' , 0 } ;
. @2 |, K; E* q
9 R3 d7 B2 w0 O, T7 S CString strC ;
1 o1 Y" C4 w4 N& k
$ k) }: y8 t9 r strC+ = ( ( char * ) strB ) [ 1 ] ;
+ p* j; R% a2 U/ Q1 m* Q- |# W+ T( o i `; t' b1 A; m
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
! c9 X( ~% u+ D! k% r+ o8 ~7 M% b* H+ q% {
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。6 D& o9 h6 H8 x3 s6 P5 z6 m, B
: A% z( `+ ?8 L% K" v
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
- U* n1 }. L- n. z
$ P" W7 M7 r) m5 t* J CString strD = ”asdf”;5 I' n8 r# n, F( C- ~
! M0 R: H9 J( j z! \9 o; h BSTR strD = strC.AllocSysString( ) ;% u0 @' w1 T; R$ b% U
7 I1 O- S) e1 h& z4 F/ P long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
& ?3 _0 |8 w; ]- D3 q. h9 a( R# w0 | Q) {8 K1 c; g
4:UTF-8码转换为一般的字符串:
8 J* q0 f5 O; M. y2 K- p$ S3 k B: _0 H0 d0 g6 a2 U
#include " Windows.h "! P/ n/ D) |1 ?3 {# r( d! T& T
. @: i% [1 N2 x* {. w: z# O * U+ E" I) E- @
! [, s9 k5 c7 ?8 @$ `$ k
int main(void)6 g3 O5 s* o" Y) Q+ L; t) J' C# D
, y7 x: m, F5 H3 f; x{/ i. `9 ?5 {0 ^/ j% }6 r1 q* ^
; P3 Y5 c" @8 h. S
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,7 ?% I2 w5 d) {/ N o
/ `7 w, ]- {' g2 s ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
4 t7 s) Z6 |8 _: ]4 p0 n0 I
) k0 |3 p' g9 h) `9 L WCHAR* strA;
, n2 }# C) b; ^3 G: b$ s, |9 q3 n- t0 {8 H$ m6 U0 Q1 v
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);4 Z" C) G+ M/ V6 U! e6 }. X9 k
' L. l7 b8 p% X) g( I/ h. E8 n strA = new WCHAR;
8 P' n( a# j) d' P" F- w9 r/ j( z# B$ N5 M `5 ?6 z
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
- E* I: ^2 T6 Z& A1 P0 A; Y1 s
6 k2 K L8 k" y; X% a( W# E. X5 B i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);7 [, y h. `1 m( e
* I0 o' l, J/ F) s char *strB=new char;# C' I6 @/ h0 p
- W+ d: ]! W; D! J$ S7 ]7 K
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);) t' `( l& n3 V- r* C- P, \5 C
+ E/ m6 {9 p+ ^) ?//strB即为所求$ S) {0 I4 D$ j8 j0 t
1 }* f* \; ~- W% ^: i. Q delete []strA;: L3 ^$ F4 q: _: g5 V
* o* v0 M7 G& H- x
delete []strB;
- R+ R }! C" ^# z
+ ~! m8 _: u& m; S5 Q9 d" ` return 0; Y; N3 n3 q5 a1 b- }/ R
% [7 S1 e" N- k, }7 O4 k}
/ ^9 z* P( s5 y1 h; a" m
[9 k9 x% R, X- Y: [& r2 ~& D5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
2 W) H4 f; M- A# F: x9 |# J+ _! T: a
#include <comdef.h>' f( X& J2 A3 }3 d$ F2 U
# \1 G6 o5 p+ Q, r3 G5 a _bstr_t strA;
- b" n# S8 F6 y6 j; ^% G
% [9 n6 B; p7 @: b3 ?' D/ ` char *strB="中国人";
4 t+ {2 X9 a0 g8 j0 c) K+ {+ \7 @
strA=strB;
4 \) t2 W8 w* V, H) ?% n& C
9 |0 M* o5 K& I z+ N9 B WCHAR *strC=strA;+ g* q% ?& w( r) y; b, j
9 `! ^ s0 |8 O$ _7 b
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
; k; }! h+ ~. g }; C) H) B/ X/ d. D
char *strD=strA;5 n* K% X+ p0 m0 @
. E8 [, I0 y' u( g( K
return 0; |
|