|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
6 |6 `% l8 M3 [# g+ [3 | M4 { V/ W6 d$ I8 w- ^& \" v
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
3 y. r* e5 @; b. n5 J' L+ r. ]
3 I* z- R b1 C! S WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
/ `0 D9 O! }; ?6 z9 R) |2 P" m6 E
& W) ?. E3 |' f: s( O% A- ^ WCHAR strB [ 2 ] = { '中' , 0 } ;
# R8 w, N0 Q; J( {; e9 V
" g, |9 t' J6 o) E7 F* ]9 ~ CString strC ; \0 c2 q- }) X
* M$ T+ L' B! v' z. \& m4 Q strC+ = ( ( char * ) strB ) [ 1 ] ;( c* l5 z$ d/ O0 `7 O$ B3 \% B
, h$ h- l4 e" e P
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
# \ f8 {- c! o! n. h9 \* ~6 U3 U* \) K/ |: X
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。: ]2 T: U7 @1 j3 Q$ S6 @- u
) U* _# M. u ^: J" X
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:3 j4 [2 ~! c4 w: X3 N4 }4 A
9 r8 \. B3 C C+ k! t
CString strD = ”asdf”;
9 T2 [- ]( `# M6 c% R( ?1 J5 ?, p3 h2 e$ @ k& U) r7 j4 \' [
BSTR strD = strC.AllocSysString( ) ;1 G* s! @" l g- P4 g0 x! ~
4 U/ F& n/ T" B long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
: y# M+ _9 e& |; F6 U# |' z6 |5 `5 x5 U" C4 E
4:UTF-8码转换为一般的字符串:
5 t( B$ X3 h8 |
& j$ ^4 Z. z* S# k& I1 f" d5 Z; t#include " Windows.h "
2 ]! k! B' w w; Q6 i) O' l: [, }* S. @
3 |9 y& B) d: A/ w: v
/ V; G0 P9 s h% ?3 o) lint main(void)
- d/ x& g9 K& P" M! {* E% n
% l2 q. a& k& U8 k/ N{
& w' ?/ f9 z3 w9 o( G% T, X4 ~0 C/ B. U* e$ o
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,+ R5 ^/ M) t1 y* `$ v0 i
7 m. g x; L6 x0 v6 r; a1 x ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码1 t& e2 ]7 ?+ b! h$ b
' y! `( e2 H6 q! S1 `. r WCHAR* strA;
( }" i1 Y* M0 j1 A( [6 f4 N
. P% s6 G3 e# Y7 ?$ c# C int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
3 N. M0 Z1 }3 x. J2 I) ^8 Q6 r5 b. L( x2 X6 i( X
strA = new WCHAR;/ }6 b; |0 E* m9 c3 e% N# X
0 E, f% {- o) w }, A3 h/ o MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );8 d) m5 S, u6 ^/ Y. K2 r
; \' e! F( y5 @! D% T
i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);* \. x; |$ E+ b* I, Z/ z+ y# q) e6 F
& `, @6 |( E1 k& h
char *strB=new char;: f$ ^! h' |" b2 M( i9 ?
8 \& o+ @: b5 F& f& a i/ B3 T WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);% }+ z" K) c. D- S8 F$ Q3 P
; O: l3 C" c a& u: |6 H
//strB即为所求4 {$ ^; @# t. [1 j) c
. G* ^* Z" y% N" D* K2 _ delete []strA;
5 c% x K' H5 G+ w+ Y1 {! y
% Y# I9 @( F: b. }9 M1 L: V delete []strB;% Z; c: y' _/ P5 e0 ^
# v- J" h5 z! ~- l# Y5 ` return 0;
$ _! R& ]+ _1 o
. m+ c- I" e% l}5 B3 K5 @; B, _. y- [
9 P B: N5 q7 _! ]1 g' ]: \8 d# s
5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:7 k C, i: t/ V, U
" r5 N/ |+ p' O8 o
#include <comdef.h>
' j, x1 n f& R$ d+ }( \8 t8 y; k# g- f k A& q$ x
_bstr_t strA;
7 W9 Q' B: z- ^! p% z2 F+ E
4 I* J2 g/ i! q8 G3 o char *strB="中国人";
' o! f5 C" ]9 B9 B1 a5 B
2 L6 g \& f: P$ V strA=strB;
5 K7 R, y0 `' ~; R6 C3 d
[- B. s6 ?4 n$ N( i) S0 F WCHAR *strC=strA;
" {/ t( r% B' M$ @8 s5 J& V
6 ?! L9 e# L1 f5 t2 p( ~% U long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度) O" f S w$ v) D/ F# @
/ C3 D; v6 X; m3 A7 ` char *strD=strA;
f3 b& B7 l% J, w$ w: X
% W0 J9 P O/ C6 N' k# z# C return 0; |
|