|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
% f; }0 f [- \5 t/ ]& Z8 G5 @" O$ q) t( G" e) ^
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
. O+ c; t: ^; B2 ], q& u9 o6 \1 C: f$ x/ j4 \, A/ `9 S: O
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。/ k" `) Y( Q) e* ?
4 l$ Q v# ]/ e& `: m1 G
WCHAR strB [ 2 ] = { '中' , 0 } ;7 J; O6 P" N1 z- Y) f0 N
. ?7 G0 l! U) q/ o/ I$ N X/ P0 l7 D
CString strC ;
, l- q, C& l2 @2 A
# U9 U- H) j- l7 c. r( d* l strC+ = ( ( char * ) strB ) [ 1 ] ;$ H& h( ^/ i5 G
3 P/ h' w' n8 ~4 S) t strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
. g: U+ f3 |) \ ]# [) C5 L, a% g7 E, A$ i% O
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。8 W. C4 H* H% N* j( T
5 V9 A' j8 k( [2 T9 V9 T9 `
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
1 w9 X0 c0 A9 g( S7 {: D! ?. a& T W) t3 c2 j* o- [* b, G
CString strD = ”asdf”;
* x! c8 L0 X, Z' X
2 l3 l' s3 E2 ? BSTR strD = strC.AllocSysString( ) ;! E4 B9 B7 J/ k. d6 { n
( I q) a3 V3 q long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
`; t f) c' K0 J$ c/ P5 _. j9 I" Q: R
4:UTF-8码转换为一般的字符串:
1 j- {. G6 V" _( G$ e( N8 `8 f$ t
1 b0 P7 p; }9 v l8 w: Y; c" {#include " Windows.h "' E( v+ l0 G0 Y8 W9 L. u @
7 u" a9 g( T8 y" {" [ / E+ k) v, |3 {/ i
/ f, R8 ` [, Y3 Iint main(void)
6 l, ?9 o" F/ S! E
: F. B$ S" Q% k$ [/ W' R) ?{
8 O& d. P" [$ J1 O5 _' d D6 {5 I: m
, i! ^/ k1 j8 v! p3 S! V0 y char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,) A% Q, F' r0 r# @
; t/ w; Y3 O d3 J% l
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
; l- J' _) G& K
! z& P: Z7 Z" ]0 d" I, [ WCHAR* strA;
2 V# M7 f. |4 q3 {9 R& z3 H. ~( D% N/ L f4 N8 i
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);/ \# x. m2 ]$ f/ |" Z, ]
$ {- Y( P+ @3 a' Z- G8 D strA = new WCHAR;$ C& L0 z* C' l7 j7 X$ E2 l8 d$ I
$ |$ j9 f$ N+ @$ i' M, }8 D MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );8 E! p$ _+ L) V/ a" ?
! E `/ i8 W$ J4 N8 I9 l8 [ i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);' c) |; i- V& _/ O! |3 N
- s# y/ z% J% m7 |
char *strB=new char;/ v0 i) P" L' M3 F% f7 G
6 i" j1 q4 ?% J9 ^) g4 J; N
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
M3 ?( r5 W" S7 E7 v ~. o
4 a- b. d+ h9 N5 z7 t/ `0 t//strB即为所求" R0 A) S! A/ b. ?# {& V+ s1 T
2 D: r) d$ [. ?, Y0 S2 |, b
delete []strA;
' _# b( |1 f% S
7 b' ^! g) \& M3 c& W delete []strB;; k) O0 f3 v5 p8 E
! [0 }; e( ]. `0 i7 m) Q5 Z& o
return 0;
" {$ f+ q3 {# p! q
5 `2 D7 Q- u; s2 S9 L}; K( b5 v2 K3 M$ k8 q$ X
) C. }7 G& W5 R) E5 N4 Z+ P- A5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
/ t- _" l/ q! Q6 c1 k" N1 P! g4 v; A
9 F, B) V2 Y" Y& f# ]#include <comdef.h>6 G- R9 I5 i2 T; J
. V. O6 j# y, V. ~ _bstr_t strA;
2 `4 [7 Y. L" f# q4 @; I5 A; h3 F8 M) d8 G6 x1 l
char *strB="中国人";& Q0 `+ V! f$ } t4 V
& D# J5 V; F" p6 O0 T+ y7 ?% a& i strA=strB;% R, |+ i+ g4 L% K0 f! G) m3 e( X
. U( f+ e$ D. P4 J) G WCHAR *strC=strA;; P4 K! W# d L9 w: V* k5 p0 L
0 e3 v# p R9 r long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
`* n: ]7 I) S! L9 q' k$ V/ X9 b1 d" r
char *strD=strA;
$ F0 X* g4 v( W# C* R5 r
3 ^- _: [: A4 A1 O7 v9 d# f- @8 D return 0; |
|