|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
5 Z1 X) Q. q2 L# b2 h
4 z2 a; g5 H- ]2 H; |2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
0 F4 i4 B3 [, Z D7 ^
7 H6 ~( L' z; i WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。& M4 a+ q9 @* b
: ]1 F! o: s' n$ J; p) M( a
WCHAR strB [ 2 ] = { '中' , 0 } ;# P9 a; o; R+ Q3 I
* ~) Q7 D3 j4 P2 P! e6 B! Z' \
CString strC ;# R5 o9 v' E1 Z5 s$ Z9 G( E9 b1 z
% k, g- b; g3 a2 C% V
strC+ = ( ( char * ) strB ) [ 1 ] ;# F2 b, I }' c0 F
0 F5 B8 s3 Z, ?2 x9 q9 g strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”! h) u: B5 m) G2 q# d
[( ?% n5 g% W" F3 ?) E
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
1 B1 n( u2 ]; P4 h' S% V
5 @8 A! {6 t1 ]1 q+ l$ j4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:/ n9 ^+ o& v+ N/ E5 G0 b# C2 L# U
8 f4 }* U v1 B$ _3 V8 w, I
CString strD = ”asdf”;
2 R/ z% d% y& ?& e) ^# i& ~1 R/ f! W) r
BSTR strD = strC.AllocSysString( ) ;
4 k! ^2 V- y) N% u9 J# v3 f& }% z* `/ P! H. T( A+ y
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。. S, Y5 E' O" [! X
( X0 u/ c6 |8 i3 O4 z. l9 k4:UTF-8码转换为一般的字符串:
+ k) X6 G( K6 N5 T* `3 V2 s" n5 F3 M! \9 J/ H. V7 H* `" ~
#include " Windows.h "
' e3 n2 q3 {4 C1 J# M& m2 A2 n% f- G/ I2 x( R4 r
" C$ W3 ]9 j6 m3 K3 Q( {7 V, f8 w, X K1 o; e/ v
int main(void)
5 Z" w( b y/ W! _% Q0 i n8 z9 k
: j; x1 O- Y+ O{
% l7 y: z/ R# Z) C7 F' R. I4 R0 |3 {5 ]8 R; i
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,' R7 g. M2 ~' s
; |: z9 K5 y* x
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
], a/ ]9 X, R/ F$ h* T4 I
. S* a" q1 A8 Q8 {% u( Y WCHAR* strA;, W& o. X7 e- w% R- a h. }
1 H6 _8 {- N: Y
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);5 d6 e+ `: C7 Z
+ d2 d: B; w1 F9 y" B" t; g8 V strA = new WCHAR;* s+ H$ W% _9 ~& S% I+ S' ^, ?
2 G+ J) H+ r2 Z: Z3 O
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );( }3 t# L% w4 l+ H
3 d1 ?5 |$ ^4 |' c i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
. X8 W; e, ^$ }7 a& u' G" j
2 s; ?, R% ~ }3 Z( O- Q, a' P char *strB=new char;6 a, T6 c; V" G5 c4 z5 Y. E" `
4 s- s! \ Q( n WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);- y9 s4 z7 i" G; Q0 I- w! R
. D7 Z! ?* g, x1 {7 @//strB即为所求
) E- P' l C' u; ~0 O% a' |& q4 \/ k1 A, Q0 j( i4 i7 i/ @/ \
delete []strA;
] `) w# T' [3 U$ K$ b7 p: Q# Y/ R* S
delete []strB;
/ A1 x: p4 H- c( n+ A* G/ Y. D9 s7 y
return 0;6 d; \& B0 B' \- z. t
+ V/ s4 ~! |( C. }( M}& A- r" u V0 S4 T- M6 Y& R
8 A1 g5 Y6 l) P2 N7 ]" I1 T5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:! y) p2 k8 h4 l1 J8 ]" n
3 g1 n. M) {# }! H6 v! `
#include <comdef.h>+ O' V! w- g5 T) O& N, i
, p7 A5 K/ A0 g }( F- B. u0 x _bstr_t strA;
M# q5 k/ W0 ?7 D5 E) T+ y. f0 c! d% k
char *strB="中国人";
, q. ?1 L, B; S; c2 E
' C1 q" H% N6 m% N9 e strA=strB;3 [1 x7 ~+ k1 w
, {: `+ ^7 C4 R
WCHAR *strC=strA;
( ^% A% X+ L8 [' p8 U
) f R6 p$ n1 T0 K/ n0 u long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度% ]0 j. l1 \3 W: j, \& G
/ w" U; d- D) h char *strD=strA;
" x! g+ b- R9 F! J% o- _/ @) h/ s d" F* t3 X* f* C, x0 P% g3 B f/ `- G
return 0; |
|