|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
7 R* z. f$ M% D3 k; G, z7 q5 o' c8 y+ U8 _4 A, M# _0 K
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:+ V3 H5 ]+ Z1 J7 [$ I% L4 g: r' ~
6 |) Y: n1 T$ b0 x9 W. C
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
, x9 L. r7 G+ l3 R m3 e, y9 C5 z* X8 X! B# I" D
WCHAR strB [ 2 ] = { '中' , 0 } ;
* n2 `# A' d3 V4 S, s- v% S9 k. w
CString strC ;
2 q! g8 o' \ i+ H5 ~# F
$ r4 h' R% V) ~# q7 \ strC+ = ( ( char * ) strB ) [ 1 ] ;
- Y5 T6 K" v! ]- J: e, i- r- E+ k% Y) d; Z. ^2 G" W
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
, a9 G$ S4 d/ j5 y' Z. ~! s" Q9 M: G/ u# n- y3 s
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
$ e7 F% }% }; v) Z! i
" X8 m$ a2 p; W3 P' s0 Y4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
9 q; _3 [7 Q; f" f6 l9 O) E) V+ e$ e- z! k0 [
CString strD = ”asdf”;
- Y! u% w% P- a1 g) i3 P/ U! D% |. i( b+ P* u
BSTR strD = strC.AllocSysString( ) ;9 {" k. @8 Z* h- P; W4 L
# X* K& \1 K0 U) L# D( F( B long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
9 E, N- A1 _# ]% u& w( @/ o! H1 b. E
4:UTF-8码转换为一般的字符串:
* o# t2 L) @7 a, W7 ~
/ i: h7 I7 _% L; L9 n* I#include " Windows.h "
' c9 @. g0 C! c' F; z5 n2 U9 l
) k& y+ N @' Y, J# d( q- N$ g ! i3 F8 j7 l" c+ ]8 u" \9 W
& n. F& U/ w7 x
int main(void): `; M) \# l4 Z3 \
: M. F# J8 }$ v8 U( C2 D7 s! Y
{* e/ p* M8 d. F1 j& Z% w- t6 y2 K5 d
8 @8 x4 [) \6 L8 A" }: @
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
+ |: c0 X7 Y' |$ P# j
3 Z/ y9 x% j$ D- L' u; l ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
& Y- H: k" u- X( K3 ^
" c3 G5 C/ j5 x! Z2 o6 H9 |7 o6 s" f" Y WCHAR* strA;
9 U- ^4 K9 I" @5 E
3 Y# N7 p: f1 s% S4 L) { int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
% G- d! i9 Y% _) [* P/ G6 z& f
5 e0 N& k ^" Z; W# O8 U5 T1 F- I2 d* u strA = new WCHAR;! u1 ?0 b" S* j% n& W& V
7 ]: L) A' K- ~- _! \ MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );- ?3 {6 ?, g; F0 x) [9 X
5 J- S$ U1 P( L! ^
i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
$ a* S N4 j% G8 ?% l( ^: X* o0 [$ a6 i) b: Z# ]# a
char *strB=new char;
) C' K6 J# ~3 E, d& W* e' K7 F
) R6 ^6 H% |4 p% { WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
7 ]9 t. o3 B3 _$ U2 s
8 ~$ P; ^5 a/ G. L6 a$ U//strB即为所求) v) S3 b( m. E' Z% U( u7 E
+ p& n2 H' o) X# g7 o delete []strA;) S# Q, C! @6 t4 z- }
; m+ a+ t: r, H/ a delete []strB;* n# X1 L) f. ?
: w m/ K6 v- E2 y return 0;! o6 I& S% A& \: L; E& s: [
0 S5 y( K9 c, s
}# {, {6 B* h. ^
/ x9 {" B8 k& Y9 b* p# y
5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:8 N" }$ Q9 d8 ?9 e" k7 f
- Q5 N Z4 B6 J7 H) N6 Q0 N, C#include <comdef.h>3 K; C& ?) k J9 z# A
* Q7 S6 P @) U$ B& N. X8 u0 U
_bstr_t strA;
! [0 H* l; T2 h% H8 n E9 k0 a# ]1 f* c
char *strB="中国人";
) g+ b. k8 _, ~; K7 l! n5 C. t
) R% b' ^( _/ ]1 s3 H8 [ { strA=strB;$ W. s" I* |; V. u+ C7 c9 i; b0 C
- ~; O/ Z% h" l5 n h% J
WCHAR *strC=strA;
; p& n6 K: \2 j" D9 D+ R' c2 L1 { `0 T( z
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度4 ~5 |! F/ H- Z
8 E2 e3 ^& x) C. l' k, _: v" g char *strD=strA;/ H5 i# {/ M7 `! R' w: h
- O3 B: Q8 D `/ O
return 0; |
|