|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
8 J- Y% L- D' _9 _! A: ?- h- X. Z# G- N7 z; ? C
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:! m. X8 m2 ?( @& p$ U" y
8 M4 T: v9 m5 v- j5 K0 H% u WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
/ G9 {! m; e3 c x- ], G) c5 G) X6 a- a6 t/ B+ M4 g
WCHAR strB [ 2 ] = { '中' , 0 } ;
" }9 Y, T# x6 g
8 I0 h0 d9 M: ]! f& e. A; N3 i CString strC ;
- N4 m% k7 Z9 E: E3 A9 X
6 i1 Y- ]' h# } strC+ = ( ( char * ) strB ) [ 1 ] ;
! w# I) k$ M" `' g! T5 ^0 {! ~, l" D( F# [
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”0 Y/ k' m- [0 ^
0 S/ a, `* b& ^ u
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
$ {' L; a& [4 X6 L* v u# a6 @# s
7 u5 b5 R8 o* V- F" y# v7 V. G4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
9 M6 P% E# ^ M% l2 V
8 Y5 R1 e, ~ n4 ^; p7 T CString strD = ”asdf”;. f7 f/ y" C" @3 B2 L+ n4 W& h
0 E4 } Y: g3 M: Q& ]! N7 z l' { BSTR strD = strC.AllocSysString( ) ;
3 j8 s, N1 r" ~
* h- G" L3 p, r1 t' W! E7 W long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
( s9 h! A( t5 x5 G/ e3 F$ |3 F: v# B# b4 N
4:UTF-8码转换为一般的字符串:
/ k5 u3 l- C6 H) {8 ^' Q, _: T9 C, `- n0 S. I4 O; x
#include " Windows.h "
' Z+ c4 v( K! ]- D# F; W
/ z! m* S; f* Q7 E9 g1 O
) z4 d2 [6 x6 T! H3 y$ i+ |' Z: k
int main(void): j0 U- i$ } e- V2 H3 h
) K. Y5 B5 i7 L; a
{* w& _/ ~2 p2 E
& \1 b# E; C2 }/ U. p char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
) l% q4 x; a% S+ D3 ~9 \% a/ p- d- H, U
: J4 l# z- [2 ~ ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
% M1 @1 W/ c- W. l/ c% Z; d1 y" e7 i; f/ b: U0 J
WCHAR* strA;5 w: b/ c# D8 r% |
+ G6 d2 e; z C/ F1 D) o- G int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);- I: h8 A# u( V0 e! h3 |, J" b
" Q0 S: [' j4 `$ n/ i9 A strA = new WCHAR;
1 m# h& e+ z' J" v1 v: `2 G3 \. u7 E) b5 V
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );- ^* [/ Y; ^ [% ^6 z# t5 ^' r
4 {8 |9 M @$ D5 b& T* a( C5 ]) j i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);: o) T/ `3 b3 B8 c1 m9 L! h) t* O; l Q
' `) h+ X0 c1 J- F( d, L char *strB=new char;8 E `! M Y) O) v1 x7 f
4 K! V* z ?2 \2 {. r, c( a
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);! g7 |4 M4 c0 u. b/ H4 @
z/ c0 L' l ^& i
//strB即为所求. W. ]5 N+ ^/ i' z9 d) t
# j1 `2 g; X4 b$ ~- }- a1 M1 R
delete []strA;
6 x C- v' l& }: Q; p
" L, t" s9 }1 {! \* @% _ delete []strB;
7 q, k+ l8 E- Z& f* u3 _+ H* h1 h" O- g
return 0;
; e+ w( A T* P6 \6 n
5 d! z/ r/ E1 \6 [}3 o1 q& B! ?& o
5 Y$ }( O- N" M7 ]5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:" E. ]; G; P7 H
8 h' v( l& ^. K#include <comdef.h>: S4 q% w& h. I& a% y
9 H# X# }! V; _& z' e- L* C
_bstr_t strA;
9 a3 E6 R1 u) e3 @
0 s: b1 s6 R9 U6 |/ B# d char *strB="中国人";
& y& }; |$ [4 G2 A ?' J/ \4 Q. V$ s' R* z
strA=strB;. _! }& U5 G1 o5 X3 S' {
1 ~3 t/ ~3 K ~+ f
WCHAR *strC=strA;
$ F9 G! d- r& A+ F& |/ Y* y# C. G
8 H9 W* V0 e5 @- z$ t" C {- r6 M+ @1 \ long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
/ q% X. `: Y2 _! G& l. p7 H$ {# l4 z4 ~
char *strD=strA;
4 U7 f% d; p% O
# L* H, e8 i `# k1 n. ? return 0; |
|