|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。+ W% a c W/ C+ H
7 F7 h, n' G, r* Z& s8 Z. M
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:* K! y S% M6 e
. {1 q" E$ c% ~" u& P WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。4 B1 R( C8 ?5 Z
4 d6 p6 @- M( y3 \# g. N0 u WCHAR strB [ 2 ] = { '中' , 0 } ;
" G8 L9 D. J, z* Y. v& [7 \" B1 n2 e. V5 M
CString strC ;
% g: U4 ]- C }8 y# t: x! I
4 \0 ?* [; T; `( d! `) e( ` strC+ = ( ( char * ) strB ) [ 1 ] ;
: R) f* X0 z' \1 {! D$ U
` Z7 y5 i; k! j0 o5 I7 l strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
# ` {( I0 z9 N) Z. X9 \2 g: `' S$ o+ a
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
+ ~6 ^; M# O1 |( Z, i$ d1 T2 g
$ Y5 i. g& Y0 z: C2 \; l4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
4 o+ }* i n, L- w
2 Q8 g$ \3 Y1 J$ {3 {, c! q. B" F CString strD = ”asdf”;, K$ A4 q8 d9 ~, z; F/ I( r
, D& b9 i/ ^/ p1 O& G
BSTR strD = strC.AllocSysString( ) ;: m8 F3 ?7 X8 y. Z3 u( X; h
" X, H2 n% Z* i long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
* q6 G+ V4 j1 S8 V
# ~# {) S* [ u, t& n$ f4:UTF-8码转换为一般的字符串:8 j% [0 k! F* a$ A+ y0 ^5 p3 _
. C4 ?4 n; X9 S3 f+ `#include " Windows.h "
: K, |2 J; x& `0 e# Z0 F
4 x; m) m$ q2 L5 O* z) T8 L
# ~. t( n+ A6 Q" e1 @
4 n9 c. A) ^2 s) s6 ]int main(void)/ p' e; g7 G2 E0 z
8 X* X; Q& Z" R& }{! o: r* `3 M+ Z' p1 j
2 N+ _- P" Y! ?! e char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,3 c, R1 U, r5 X
( C( k1 y6 H7 _6 {6 S) m. u1 w; O. V
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码2 k" l- w+ B$ y. w( ^
7 o; j' ^( w# h* ?. X
WCHAR* strA;
/ t% B I% P, `8 h+ \6 ?3 u4 E+ j! Q9 f% C
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
+ \0 C' K, |; t
; e) W$ d2 A* T3 G( i strA = new WCHAR;* n/ e) [( b1 D# q' s; L
! G6 l$ Y, f7 E( X MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
) K2 ?( e+ ?3 O4 o N/ I6 h' g0 z2 |1 u1 U8 ?, K$ K- W2 J
i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);2 U5 m, V* @5 o# z& C4 z
/ I% G( X; U& y$ _' @+ s char *strB=new char;7 G5 w* k7 n4 l) U/ \; F
$ D' I: u' a7 N7 a& I
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
; m, h$ x1 J* w6 l3 f
- p( E& B# s, V+ [$ X3 y//strB即为所求1 }; F( K+ X! x9 Y* p: f- j N
0 O7 Y) t' q1 i- U
delete []strA;
1 P) k0 r0 ^& d1 P5 t |+ h4 }1 z
4 m5 I# x7 J) S) S! _9 J2 l delete []strB;
# e$ j1 l* \# e% M T* r; @* I- Y0 g0 a2 O+ F3 X _
return 0;3 Y' [" w0 |) [1 L8 ?( F& f
* r+ c6 h: }" E0 Z& L3 d/ r1 }
}4 \# F) Z) W; P4 x9 A' U
9 g- k" _$ A4 f! u
5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
' S2 ]% e* L: }0 T4 m, l0 h3 F$ a" L o8 U3 @
#include <comdef.h>0 q& R% {, P" \- x
- z. @; O' N4 ?' X* R, m5 P
_bstr_t strA;* m0 Z' F) p, U, n3 H
7 h( `& |/ Z+ x
char *strB="中国人";
6 S8 d F% q" e$ s% g8 F: k
3 m8 ?" I6 p5 ?1 A/ k5 O strA=strB;
$ R" V. y; }+ E1 d
5 z' x" a' p- W WCHAR *strC=strA;/ {$ D( {6 \- T A; S0 Z
) ]" _/ y9 i( v7 ^+ g" U
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度' n; N* y v. s
8 L3 Y# {: w5 y: ^: [; i$ R char *strD=strA;
) A. s3 x( _& T+ X, q/ \4 q* F
h! ?5 Z1 Q8 y: H2 o: B5 f return 0; |
|