|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
1 w& A0 w5 a: [$ m8 k+ d2 p7 ~. s; o/ G9 \, t* b4 w, d: P
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:4 A5 [% {3 c0 N6 }6 h
" I% _) M- W' w* u) i4 C- {
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
3 M6 N8 {- v2 |- a- \
* O0 z, U: F2 n0 B/ E- Q+ m WCHAR strB [ 2 ] = { '中' , 0 } ;
8 c* l& V4 c5 z
1 ^) }& a; `* Z0 H CString strC ;
& z& X% n& s; m+ ^* k2 p8 d. i9 H: g: W3 u" ?9 |. m
strC+ = ( ( char * ) strB ) [ 1 ] ;0 A; L, h7 ]5 C) z
3 m+ T0 Z+ w1 h1 i
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
' u* [- n0 f6 ]3 `" ^2 s; j4 k' ^ L4 ^# [( q
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。! i! Q: Y+ l5 C6 y! T
, ]" H" w3 x7 X f& n, Z) U4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:- ^3 [: [9 t- s; s( x7 l$ c
! e6 }1 `$ M1 K& p% G, j* h2 H CString strD = ”asdf”;
) ?" d3 c0 q; T; f/ z4 u1 l: B; C# d9 ?' |( R: R S- ], h& [( a
BSTR strD = strC.AllocSysString( ) ; O% S0 C2 D! M, W
$ J+ B. X+ L7 o
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。& _6 F3 [6 J$ t' m5 b/ B" U
/ Y8 l, ^# o$ c! p8 ^0 X: n" L) N
4:UTF-8码转换为一般的字符串:. @, H/ ]; a" e& A" T- x
2 t, p, b! L2 T8 d. g0 ~4 w1 s9 Z& x#include " Windows.h "7 |7 c6 J0 `, ?0 H5 F- {* p
- t8 t3 }9 b: G# \8 n* N; x
7 u9 k7 D& J# w* E2 J9 t
: e e: J! b6 T& K9 ~; g& Y& b& g8 `int main(void)$ N: x. \- Z: D! x \$ V" h, W
9 K1 f9 f& j" F9 ^) Z* n2 ~
{
3 P7 J* \8 L4 m9 E2 [0 y3 y, U
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
* k+ E0 N" W) n8 x$ ^4 m6 v0 f# [: t+ K5 }2 R
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
. ^* _0 c) D& o; n" G9 u' [8 d# I& y- s. ^: ~6 Z% n
WCHAR* strA;
e3 |* A! n& c6 o0 H! \
# j8 L5 k; t7 f: r9 ` int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);7 `: v P: s2 [- B2 e. i" O4 G7 \
c/ T$ C- |9 t, T( B- ?
strA = new WCHAR;
% B& a* ?) t+ e/ H/ U* ?) C( g0 g& U# `3 B
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
' I! f1 D8 n: ]1 c
" W: A0 M/ J5 S' P/ n i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL); v+ q0 h( p. {2 w4 r
: X6 @! o2 v% }+ B; W char *strB=new char;. v4 y) w3 Z7 i' @6 n" V
/ o5 ~8 m6 W1 q, ]9 G) b
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);- _' G% E$ g ?" O# X8 z5 s( m' T
J; n7 {% n8 F/ m//strB即为所求% C3 [( O3 K$ M( z9 m/ I+ g9 `
6 r! `9 i. A8 F/ z0 j0 K# e U delete []strA;5 _' t8 e5 F5 b; k
) F5 ~1 a2 ^9 n' ?2 h: s1 w delete []strB;
9 g, d$ I) Q! [+ X! x* B8 d$ N) Z/ h3 Z' B5 U
return 0;
4 G, O3 y" Y( k f4 h5 q9 O7 }6 ?/ q6 d1 N) K5 }2 T' K! U! @
}) l1 H% @4 q- N9 a
; r8 K; I! J7 | B5 p5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
2 f* ]2 Z$ E T4 ?. ~* {* a
* t7 B* u- U p5 ]#include <comdef.h>* X r0 q4 `, A6 \* I4 T
/ _) I4 L0 X9 n; c+ J$ Y7 R _bstr_t strA;: F6 t0 S0 h4 \4 Z
# |, N( F$ A7 s6 h% I+ r char *strB="中国人";
; U6 s# c$ d0 R, G6 I% V/ x6 M i6 C- [4 i$ g
strA=strB;- m) {0 d+ k/ y5 ~4 X
& p- M4 C5 d9 ~! M+ k9 ] WCHAR *strC=strA;
% c7 v, G$ _9 M8 b2 v. o" `& B9 d- c" i" [* w0 g
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度) E/ U+ o/ D3 \# W1 }: v; l
- K1 r p) W) L- o& f; O char *strD=strA;
/ h# w1 u7 _. @% s3 G/ q0 t2 ^5 k1 d9 c% }: W0 X+ c
return 0; |
|