|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。9 `4 Q3 f9 k8 H( i" V
/ Y/ S1 C W+ G/ N5 r1 [
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:" o& u4 y5 _. |& J
# v+ a1 `+ _8 i+ [! e5 r WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。+ K/ x4 D @$ ?, Y7 H
2 h6 u3 t$ t7 [ WCHAR strB [ 2 ] = { '中' , 0 } ;
) d. N7 X7 N6 q3 {% p
y6 i2 `- s, b+ n) d% }+ z, C CString strC ;
8 u( @0 z5 c. N8 ^, T. j* B6 E" _
strC+ = ( ( char * ) strB ) [ 1 ] ;
/ f4 `* H) c% i, x" l3 Y7 g! F! F% n r4 [% S; R7 Q: ?
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”$ S5 E2 X* ~/ n2 v
6 B+ N0 q0 U: t4 ]! D& A/ [3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。, j! T$ b. j2 M) _6 L! O& O
, A* ] o$ \* g' i
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
* G! C. C1 B8 G4 j, p' L* P$ e
5 @% k3 E$ r, y, i CString strD = ”asdf”;/ L; D5 l+ w8 y6 Y0 T8 d* a+ I# o
! t0 ~( Y3 _, P; G3 ?' j BSTR strD = strC.AllocSysString( ) ;
% U3 }6 d: _1 i/ c3 }6 R5 Y! C1 b$ v( Y6 |# P7 D' \
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。- u6 ] B& H+ c2 C' {
( X' [7 a& G2 @4 X& G, F1 B" G% u4:UTF-8码转换为一般的字符串:( R/ J! c$ U, @
! k( g% {' j& Z& D }0 ~6 w
#include " Windows.h "' k9 k% N4 h9 N
/ y# y( i( y! L9 ^2 q % o% N+ V) j3 l- ~( P
9 l5 d; ~* B# r$ W3 ~/ d. B1 `
int main(void)4 e3 m* D4 v9 x
$ p, ^0 \6 F: _0 Q5 O1 B{
& K$ y" ~7 E" } W1 t# H: H5 H) N7 }' S) J5 o
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
* `% Z) Y; [6 H; Z
1 v4 l$ r# m8 \" |$ u, D3 ` ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码- h6 c! G2 p$ s( f
. m) G. _1 b% Q$ ~$ o WCHAR* strA;
: h, Z4 y/ X% L! w2 ^) H, c8 k9 C' |- ?
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
6 S3 f) H; P1 l# N. C, T
& s/ b4 F) D# v r6 N! e' i' N& G strA = new WCHAR;* T2 a1 V+ I0 i4 a8 ]8 w! f
) u) I6 E& w9 j8 E6 @
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );7 y/ V4 @( _( R. T. S1 @
) _/ j+ ^ m, V e i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);: j, [; g+ w W! o# i1 ~
2 {/ G- G8 k& v' l: Q+ y char *strB=new char;& P5 n, C+ F9 g- Z4 E& S- o
; [7 A, I* z0 L- c) ^; a3 @3 p9 ?
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
2 ^; Y% v. n- N- z7 o9 a; f% }
5 L! x3 y. m4 N( _# f5 l//strB即为所求 h7 u; J+ {- |$ E
8 W! |9 ~1 s# \# B! |! l4 q' y8 o3 } delete []strA;2 P3 y2 X' w- t7 K6 ]. ~5 [: ^# D
4 F c$ S) N6 Q8 d; Q delete []strB;' B0 G5 |$ t5 D) d. h2 K+ D' s* u
: N( \# w$ q* O7 G return 0;
, E$ l$ H! `+ r2 y# k* t1 u* H" a. w, s( D y0 J
}$ }# J7 U/ Y7 V7 p- I. L) U. Y
# ?' F% C' {, x/ P. s4 j+ n, j0 ?5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:- M8 B$ c$ W. X. ^* r1 Y! m
4 o; `, ]" C9 y) U7 M#include <comdef.h>6 z2 A0 L1 t! k! I
# P4 U7 \: \- q* k' H2 [! S7 v! z _bstr_t strA;8 P0 O, E* Z$ G# `" F7 ^
; [ V( |# i% B
char *strB="中国人";' i- n9 ^5 q3 c! O) o5 Q' j
/ O+ S# n0 N+ k, P5 T strA=strB;
$ T* ~' `+ M! C, x
; J/ D1 m. _+ l+ D6 V WCHAR *strC=strA;$ Q" R& o, V; ]
4 D$ f8 V+ ?7 F2 v
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度# P& Z$ {' f$ H. |8 j/ j5 j2 f, M
" ~" t7 [( j7 E" {, r char *strD=strA;
4 h! i, j# W* Y" W4 f) | H" F- \
# s$ K7 V1 t1 m# e- i' O; Q C return 0; |
|