|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
0 D) F4 N1 a5 F) Q$ F4 |0 ~# G' C
" X5 d3 m; M; T6 ~8 q( O) w! F2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:0 T6 u! x4 s& w7 m/ n, ~) c9 y$ {
& m* A* h9 G. t( x C WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
2 ?0 ?' C; `; |
1 s+ h; C9 M+ i! H# F0 o WCHAR strB [ 2 ] = { '中' , 0 } ;1 L9 i' Y: m% q. M$ ^9 d, x% F
+ y6 E0 _0 \3 B" \/ R# I CString strC ;
p) r+ m) ]3 H+ k4 t) r2 m5 Z& N# Y. O2 l$ K5 [
strC+ = ( ( char * ) strB ) [ 1 ] ;
' c& j+ B# R/ M* b
% ~+ }: ]- e. O0 \ strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”. a+ ~/ w) x( Q$ P5 w! W6 e
' {$ ~$ n/ @( `, L6 P2 f
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
" g2 b( f2 [, A' A. x% ^$ k1 ~! G+ _" Z2 M
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:: V8 C: [; I5 ~, Y8 b
9 i) l" ~, ~- O. Z$ [3 N CString strD = ”asdf”;
, V! G' X2 |& ^. G( t' |
d9 B p6 `( W, L# n3 p BSTR strD = strC.AllocSysString( ) ;
; j# Z7 l' ]* F7 r, ~4 m% U4 X
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
5 s% a' e3 C$ _4 k4 R
0 F# x1 z n( d/ I! P& X4:UTF-8码转换为一般的字符串:4 ~0 ^6 ^3 o* f# u0 x
$ ~/ q, a, `: W% o* c
#include " Windows.h "
! F7 ?1 c' L1 `
- c( Q( S9 x+ t/ q
3 d9 P- [5 w& b# R$ o5 H/ |
; ^: h, K' ?' Q# G% [8 Z! Xint main(void)! T) P$ E, E" J- u7 S& h$ C6 Y
4 K* R. W3 Q4 a7 s" L{
. ]$ {8 g' D m2 q0 A2 b
V' b1 e7 [1 z$ V4 R2 g2 B: `: ` char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
3 X5 A r, P [& r) C7 F9 a: q% J) {3 a6 c- g, T
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
$ T+ Q P0 ?1 Z* d" f u1 ]2 D
) S$ {) s) T" U8 k$ f: Z' F0 j WCHAR* strA;2 {& A5 ~' X1 u, \' k- Y
1 T4 } N8 q* o8 w
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
+ ?$ A$ A6 ?6 v9 v6 o$ Q2 Q, H
b# J6 X+ D {0 [0 K8 o4 ~+ N strA = new WCHAR;) B) X" o& @3 d/ X! u' ^- Z! J0 r
5 X4 O& [. g9 x) W* Q, | MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );9 e1 Z' `3 @* e. e' m
. L* q8 v) ^- f9 v i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);2 z: I U/ w) F8 [
0 y9 |3 U5 v' _7 D# Y
char *strB=new char;/ e2 ]9 U3 l4 }. u
7 J7 T& z: C+ @8 W6 q$ d0 K+ L
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);3 B; w& J4 ^0 X. a( X
# H% R6 N4 Y4 T/ m
//strB即为所求6 b7 |) H* Q7 @( h3 i
5 }- n; F# [- \+ h1 E! U delete []strA; V! |3 t2 V: v& S" b
( l% M- b# r5 J/ D2 t
delete []strB;" I; K5 d7 I9 [* A" M- e3 k
2 f2 O6 v8 s# I1 }: I return 0;2 ~4 q" J2 q0 D/ c7 ]) i
' ~7 X5 {0 e9 A! v
}
9 Q2 ^) C. A; J2 I; {8 {+ r+ K A
9 C, D: f( j, K' A# O5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
" ^! F- K- t8 Y z# D
2 c8 ?, Y& p9 R' Q3 J, L9 S#include <comdef.h>0 D9 q* j! {; i4 \' |+ g, |: h
; b) Q2 {) Y' ?* x" P. X _bstr_t strA;
; ]8 k$ k1 v/ i1 C! |, |. r
. I+ t1 q7 ~2 u# @ char *strB="中国人";6 [- ~" O# b: Y" y- i
7 p0 M. S+ A) m
strA=strB; j% d* C* K: P/ L. c; U
$ i* X# ]8 V- l% w0 @" r1 r. T WCHAR *strC=strA;! f3 O3 g C" h o4 o/ t3 e H
2 O/ P: u# s$ J) R+ A long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
i% g4 Q! K& M, X$ p. R# x
/ G/ p) ^3 M, `$ N0 J2 _ char *strD=strA;4 @6 `" L% U/ e e8 l% a x
1 d( g0 D" x- `& ]1 j return 0; |
|