|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
$ p: \( v% L k9 X5 E3 u5 Z2 ~2 L3 D& M- @6 x% x$ C
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
: |8 E. @+ m a# W2 B( G. v/ C' E2 [! w3 P% B; e
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。+ h, x4 ~( S3 v% M
2 {1 h8 h+ U ?) V& |$ Q
WCHAR strB [ 2 ] = { '中' , 0 } ;
. [- b# e3 [% u C: h M1 P; B& ]& K
CString strC ;9 k7 G+ _& `# [; Y' \" C" q' v
9 i" G2 C2 J/ b* D
strC+ = ( ( char * ) strB ) [ 1 ] ;
& z/ O- {& o `3 v4 T) }3 ^2 {+ \4 s
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”; |% D- X) ?3 {) c& X' F
/ c# G$ P3 d& Z* X. @3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
9 q- w5 C; X& l7 a {- v# r. a0 B4 r+ f; M
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
V6 g$ A8 J) C- w$ u2 n* c g& Z$ ?, m, d" [8 D; J+ z3 Q0 k
CString strD = ”asdf”;( R% p, v- P K' z0 J( |; ?
e4 U. q$ u0 }
BSTR strD = strC.AllocSysString( ) ;* w6 X9 G- B% ]$ S. F9 j# _3 z
$ H% E5 j2 k. e" N: b long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
- \4 g- z7 I5 E+ `& r" K, e
3 M3 y; `6 U9 @% I9 s4:UTF-8码转换为一般的字符串:2 M+ Q' ]6 |: h" a$ v
0 {6 N# g- u; v#include " Windows.h "
4 z$ I- D6 D! }; J m% u- g. r2 ]8 P( y. A( k, u
6 ^* U: J. [ W1 j8 T% R8 B/ ^& R3 _) t3 m7 L4 b4 R/ x6 Z
int main(void)4 S- A& B* i6 a; G8 A
, C' q. \* l0 X1 G' }
{
% S0 z& K) {7 q+ f# Q7 [- P* }; ^0 w6 t* L) G/ S# O
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
4 d9 G2 G1 T, I6 s0 b( ~5 e! s: S- n9 n: C2 w/ [
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
0 ?5 X) j' J- |- m* U, k; r x' ]9 N! n2 c* b& M: i
WCHAR* strA;$ K6 T7 z+ g$ O3 e; T! _
$ T% j' C4 Z7 [. i% l int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);2 z I+ q x- {
9 z3 f4 j) v! [- @8 e! V: t
strA = new WCHAR;
: @& u Q" L: Z) |% ~4 S/ i
% K+ m0 H2 R l: R" j! \ MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
& G( a. l0 X- T- h. x8 J3 W" i( c9 g- N/ |7 b. u/ B
i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
' j, a7 g q- y/ F6 t/ a# h! ?1 G: C% d w' a7 y4 k
char *strB=new char;
s! @4 r% b. d8 {8 k8 Z7 A; |' [
9 t7 v: v, T+ e WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
) ]$ o: b+ |* i) m) o+ v- W9 J6 {4 ?( d0 H0 q% n y8 Z m
//strB即为所求
+ r$ P& Q# i1 `% V+ J d; j9 T7 t/ D
delete []strA;
6 t8 v. { D4 Q# k8 `: z9 o# F" P) Z7 a, B/ K6 Q
delete []strB;6 c& q4 S6 A& l( O# ~' r0 e
: `' Z2 I- g; N J* K0 S return 0;2 q& z- I( P* w: _! f
; O. O) U8 y6 k: U& l f
}* l5 r1 _: C+ D o9 k' g" z: O" I
0 k0 a0 d$ G8 B% ~' C) i5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
( _+ z) i3 S; |! e, W, j0 R6 F; u' s7 z2 l/ e% e7 l
#include <comdef.h>
$ f0 _; d* V, W5 f; r9 i% ^: E, N' d( Q
_bstr_t strA;) h# r2 [1 ] {/ H! ^
! G2 J( E5 r+ x- t6 O$ Y" A char *strB="中国人";
/ c& ^) m; o6 T9 B4 T/ @4 E% u0 q. T; R' k, z/ ?/ Z' c% a
strA=strB;2 \6 Z9 k; a4 F0 U* j
! h9 l2 y; T: r f WCHAR *strC=strA;9 D& w8 A7 ~: c
Y1 S/ Y0 i ]9 U$ b% k5 n9 e long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
8 H6 K" j5 _9 `: r0 W
* r B" w& y9 d4 j9 ~6 { char *strD=strA;
# |/ C4 T: h3 t* F( D0 y& u2 R9 t. Y; l7 }- u
return 0; |
|