|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
0 g. _) A; T/ s* `9 A- `6 j4 N! {! D( A( \% f* p b7 V
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:: Z' [& ]: G6 K6 x F% B8 [, m% ?$ ?
l0 k* I) L5 ~ ?
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。6 a5 W# O N6 E/ K6 T9 q- N& ~+ c
2 f5 M! m _, n7 C3 X3 h x WCHAR strB [ 2 ] = { '中' , 0 } ;
& T* c6 s" F( K4 M- _- L3 N7 W
' V1 U* r$ v+ e* a. U9 E0 l: Z2 @ CString strC ; U W. }/ B* d3 \6 x5 Z: F
, e/ ]) t8 x1 h X4 N; G
strC+ = ( ( char * ) strB ) [ 1 ] ;" }' H2 {" W0 a8 _% ~2 N# V
3 {8 L: C& l% u+ X) m0 f, p
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”1 m* S4 f' ^$ c- E
7 j& ]% F+ e. M$ K3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
, k' a8 g2 s1 Z# [; c7 a+ z$ j2 f0 a6 P( l+ X% N _' y6 @
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
# C# ?- z, l5 y" r7 C5 y
& D+ M: W7 \3 U, I CString strD = ”asdf”;
" q# ]3 L- Q: E$ y* y
, @2 L" g7 j% y3 p9 L BSTR strD = strC.AllocSysString( ) ;3 k* K- a4 b8 P/ o
7 |( D3 E$ b- Y$ q' U L long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。% r6 S/ [ D6 W2 j; I. e- N) V, R4 V
& Q7 k2 x- [& @
4:UTF-8码转换为一般的字符串:
) T- ]. H2 v: l% S% x: E/ g. k" ^5 V! t; c# D. o. X
#include " Windows.h "+ P7 |( A% T" w i6 p5 W0 Y$ d: ~) k; N7 U
* \; X7 U. t/ Q5 r& T1 l0 V
: X2 Y5 F9 A& n- u7 Q% X! t* u* a: a' \% T: L
int main(void)
6 c* {9 C2 J2 ]! [; _ p6 {; ?6 l- }( ~/ F1 j' v! t8 \
{* m, J2 p5 x8 ?2 u7 u+ i
7 V( D% ~+ d( `/ t6 ?0 B, S
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
4 n3 e, V+ t: s5 X+ x6 w$ S- a1 a. ^ ?) J0 w
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码7 t0 s& V# m) g* q2 F9 F# R, ?# l
5 W ]: A1 G0 s+ l# M1 |& ^! @4 k& F
WCHAR* strA;6 P3 K+ a# Z. I; [
5 M- q, i5 R( A. a- B; g& ~
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);9 |4 l& s# j |8 g
' `3 i6 r' w' w" C1 P, u2 S. P strA = new WCHAR;% z3 k0 [3 _7 L
7 e( s' `5 ]2 m: | MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
0 ^, I9 h4 w" b* g6 Q, W+ |1 \
5 w( O0 O0 T2 ^6 d8 T5 k# ^ i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
% p. u- b3 \" Y% f1 F& r: M0 [
, K& h) S2 Y8 S5 w/ A: L char *strB=new char;* g: T4 {8 E; \; y
2 X5 Z$ L; B4 {' Q WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);9 q! ? y& o5 d$ J' F0 u
9 ?( z0 F( @8 `7 p& S3 b2 }8 a3 k//strB即为所求0 I; D; g7 }2 h! N
# j/ r4 h5 a9 e0 ~
delete []strA;
& V( r2 y( G. O1 u0 H, V
) F! e" h( q1 \) ]" ` delete []strB;
q b/ Y! J7 l( k0 j6 l, k) K8 N! ^# j
return 0;: L& F* Q8 y3 q9 o( r5 l
. e% E+ A7 H* [: C3 m}
7 m1 ^( T% X4 b& K& a5 s& V: V9 k S; W S# i+ C
5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:! g. c4 P) [' q- j2 r
1 D8 \2 h3 ~. v/ H
#include <comdef.h>: T- v+ ?7 Z4 a4 C. l/ t: u. a1 c
9 f& w2 J3 R* C+ S2 A* Y" |
_bstr_t strA;# C" O" j7 t+ `1 G- e
$ u8 j/ P2 h7 D" T4 Z n' ~
char *strB="中国人";; d E( }! x* X% ]$ O
$ S7 n% a. g8 @! b1 l strA=strB;8 S0 R/ X4 B$ R
6 h5 h7 p# s* a( B4 X
WCHAR *strC=strA;" B+ {# {3 }8 l& L4 U7 q! q
4 z4 n0 P, `/ Z+ {. ?8 B, q long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度5 O4 U' [$ [. q b# Q9 I7 X5 C7 r
0 g$ z# F- n% H. b. g7 A char *strD=strA; s* l* g; i7 E8 Y, Y; w2 [
- _& s; ~/ @4 W& z j0 D: n return 0; |
|