|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
* Z. V# s! ^+ y/ v) A) D
+ A3 c; X) C6 T: H2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
- s; f6 b' _2 n7 y: E1 a# V' K9 X% ]% T& u/ B4 W; s0 k" j
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。+ r; X0 ~. g, e8 V
: K# k, b4 H# e8 a; t& c WCHAR strB [ 2 ] = { '中' , 0 } ;
$ w; @! a( L; J% h: a: j
- ~" e# E) E3 r" d+ |$ t& B CString strC ; _" V4 w" m+ H! [. N6 s% r
+ e6 ?5 `* a" K strC+ = ( ( char * ) strB ) [ 1 ] ;% G0 G" s- z* o; h6 ^, E/ \$ p+ n
4 ^' ^) e6 G, b$ N2 y. u
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
: G1 l0 F6 g. w! y+ \
! F! S6 {+ ^! E# [8 E$ r1 _0 H4 K3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。+ ~$ |& `$ r8 F; n7 Z
% ]+ o* o" U, V, F6 o1 ^4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
& p) I( q# g6 G( a
7 N( c( y5 B O! J z# e( W CString strD = ”asdf”;
@) a. E; q9 X# U
b" {% v+ _ ?# y/ K- x' O1 Z6 c BSTR strD = strC.AllocSysString( ) ;6 X: ]$ w9 \6 F" F1 {$ x: X
* m: t$ I2 ?0 Q0 Z7 H8 i long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。; u9 g+ ?* G; B. h0 D* q/ a
# B" \3 ]) i) {% L; ~4:UTF-8码转换为一般的字符串:* Z8 J8 U- i7 n7 L7 U2 M* G g
* u6 b, {( D) h" x$ f& B1 e( z
#include " Windows.h "
2 k3 n2 N1 g. e& O' b9 K/ q- \6 |0 j3 E" J7 x/ l; w
2 C' }' K2 K* Z' [% S/ V5 s* G$ ~1 `0 n; j
int main(void)
2 p% a$ g; ?* o- M/ t2 A; @- H3 R0 w& [# R7 e! G# H$ p* v: ^
{
( W3 p- f$ y* ]8 K& P* X& i5 j/ ]8 ~) a
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
# y% o( W- u1 j+ C4 i5 F/ G" Q% p3 _7 N0 ?: ?; ~/ j3 e
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
, e5 v8 Z8 G8 ?+ ~( i, Q
0 T/ p z* S0 Q/ X& ?1 v1 F WCHAR* strA;9 }; V1 j2 |) B8 e* b% B: ]5 X
. ~6 g' L; T! X: ]
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
( D+ \- \' e# n% n" B( Z2 u" }# z5 W" M' H$ t9 ]3 x
strA = new WCHAR;
6 c4 y* E5 a. ~. _: V4 _
/ ^8 i$ m& G/ k% f+ T7 y* ^; } MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
. Q, j/ @0 P; Z4 }! K8 X
9 \5 z4 N% i% J' k# w$ y9 @ i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);$ ?' U% M2 g" S, @. {. |
, b6 }7 X; G6 C0 n0 s2 D$ U# ?" D
char *strB=new char;
$ Y: e3 E5 Q. J5 j* ?: {; u4 b! p% k' k
. u# X8 x0 I0 n& z0 G* N1 U9 Y WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
8 F* C5 W. \4 w4 X
! S X: J9 x! i/ r& M* U//strB即为所求- \; q1 c* x0 y& X5 V
; `* T7 P* W3 p
delete []strA;1 D3 W$ N: s1 V7 U- x4 z
2 E% p0 l0 b8 f9 J5 L6 u delete []strB;
* \2 _( T. ~0 ^+ s
]3 N& ?4 S( W( g- [% y+ o return 0;. L# @7 j: S8 y. k% {0 u5 d
+ h' E) S1 g A# y
}
2 i* L- b! {& ~- @% t' l% w( U9 I7 `' a$ i! d1 w* L9 C
5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:! V5 d: k' b: _, n+ _8 t
# r' C5 b- T+ L#include <comdef.h>2 S/ R. a" `( w5 Q+ I
: M+ ?5 s- e: i3 d% k$ |, c _bstr_t strA;
3 v1 ?, i# z: m+ t7 x
1 d# j) J9 O- \8 W, z char *strB="中国人";- x% }5 O: {6 H
, B* K$ r% @! ]7 a$ A; {
strA=strB;; I7 K, s0 O! n4 H& k
u0 D( |. C; x WCHAR *strC=strA;
( _: c: G$ p" H6 M$ {& P! H$ ?/ D# ^0 m `8 [+ @9 e, t
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
2 V: L6 H. A4 y7 Y
+ Q7 S+ D) x2 H0 m1 m$ b7 E# N2 G4 y char *strD=strA;
9 `! S7 ^0 V, M+ _& F7 _' Z* W7 e% a' Y6 f0 f8 u
return 0; |
|