|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。9 T+ K6 y/ l: l5 A
1 T' X, b* {% Q, _: m4 c7 _
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
0 g, v( G: a+ m' H8 f1 f! y# n$ n& [) m! Q6 [- X6 y6 O
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。 r3 F: }3 r4 y( \4 g' ~
5 m5 O3 D/ F; p1 C- I: ^" g
WCHAR strB [ 2 ] = { '中' , 0 } ;2 r2 j$ y' A6 \# U; D9 z
8 O# u1 F; C7 P0 e# R; V( A
CString strC ;( T$ K% i. x! [. p# W* v% f% E
9 F6 k" s0 l" E3 C U8 _
strC+ = ( ( char * ) strB ) [ 1 ] ;
# }$ J: j5 d* F/ D: c* j' M& E( ~$ f$ C
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”9 F. @5 M# U. O7 ~/ R0 h0 P
& l+ N$ o7 h5 S! a9 I7 @/ b3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
L* y' j; {9 D8 P; ?' A
) @7 P; w0 R) e- B% e: G4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
# _: k+ P; N% ?& x8 W
" f& x d6 r# @5 }+ w: l CString strD = ”asdf”;
m7 U; q( x+ Y/ m, ]$ ]; \3 P& `: Z. R
BSTR strD = strC.AllocSysString( ) ; A( ^' j* B# i2 K
' U1 b: R: j2 r! k+ A6 T ? ]
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。4 n( P" O; Q( x9 p% J8 u( p7 p+ d
( t* Q9 D m& m4:UTF-8码转换为一般的字符串:) s9 X% `6 |* X- u& b5 P
, {# c9 \, J6 ~#include " Windows.h "
0 L6 M0 J* g( E$ O8 N* t4 S
* t7 N B6 S) ?6 y' E; @ + l) c$ m! r; s3 u8 x
1 s, l- P3 V, R$ x! P' aint main(void)
5 Q6 k/ N/ W& E% M9 D- J# ?; h: S$ `" r8 e, Z
{: Q- \/ c# M" d' v% V, Z6 n
$ I* J h% C) n6 { char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,3 `1 Q7 |0 i" U, \
& |; D6 n: J* [+ s+ T- K! h
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
) T x4 W& J- I' C1 T# U7 u6 S' e- H/ c) o# g& S; i2 A
WCHAR* strA;
c! B. A/ T) N8 V
: w% S! I4 z$ t! m: f) y int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
2 x8 s6 @8 |" w& \
5 W+ `& j0 o Z4 R5 Y strA = new WCHAR;4 k' J# z; d5 X# @& F
8 T* P; ]6 j; F3 D MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
8 y E& I) [- t6 ~* ?, F
; c0 r( x; |8 q" ]; O# e! s i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);! W6 [( V2 N( F8 d0 Z# ^0 w
4 c7 L- o8 O5 c, W
char *strB=new char;
/ W" z/ [5 l6 J6 k V1 E, v
( i) } U, Q8 v# u/ y9 T WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
0 }5 }) L# R9 I, V$ D% P Y1 i1 S$ r0 G3 T" i+ D% ]7 b2 L; ], C
//strB即为所求2 l0 m/ a0 U; q1 F1 O
; [' {" d2 b6 T- h delete []strA;- y3 j9 [9 r2 N% R" }9 x+ u- Z
: b' z4 g% V; l3 `! p G delete []strB;
6 Z( d& ?# a! l2 \
6 c! w- T& z% Q: F return 0;/ N U- U3 U1 X. v' W" q' D6 y
5 M! y8 K; @) Z* K% w* V
}
8 }" ^/ D" d: m, _ }5 p8 k
% l1 X+ [& c/ ?. b0 h% ~5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:! }# N+ m- ~! @1 D: t
) N: h. I3 A. L% d4 f
#include <comdef.h>* D0 e( }- P% {
& o) y [& ] o s- n _bstr_t strA;
; ~+ V0 S7 R0 J. t: {( d
! F8 o. G- |, T" \ char *strB="中国人";5 @4 N! _* Q& `- z
% ?9 ~( O. V5 [- \6 g strA=strB;
" C& m5 B( g. k' c8 ?' H3 \) V8 F% N2 {7 `- f
WCHAR *strC=strA;
4 Y' H) z' T4 l$ P& `
" L8 c+ e3 ?5 Q long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
3 b4 D, j3 _" y
: E6 Z& @5 [3 v7 v! K char *strD=strA;. O1 H8 c! u) q2 K' N% o# P
* Z0 H, {) u% Q- R) e7 l
return 0; |
|