|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。
; `2 v! d& ?7 v, a
& E: \2 O5 u! B( w% s" L2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:& q3 x/ E3 _' u" f1 q) Z. j6 a
4 l* C2 \7 J+ o: v. K WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。6 {" A* x' k2 Y& U
' C+ F8 ?% i5 i2 G WCHAR strB [ 2 ] = { '中' , 0 } ;: E& v- c6 u( ]) G: F4 A
' o+ |) j% v" Z CString strC ;
" U% {' V% r5 Z
+ H7 }# l5 W2 }4 _% y strC+ = ( ( char * ) strB ) [ 1 ] ; ]% s2 c7 C6 I# W* K" z
; f) v) d+ ^; g2 n/ @ strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”1 e0 ?8 q6 v( R. _4 z
# s' |6 R, Z! k( j6 s3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
& B; u5 ~6 e* U; ?0 Z. e, }
% o% @ B0 Y( K" `9 U# Q. ?/ K. x! _4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
. d8 |; G. H/ H: S2 L+ \: m" w- _2 q( B
CString strD = ”asdf”;
$ [# j$ @) N( n; X+ W# R" J) ]6 t5 a
: _5 A' z4 w6 z+ @- J" F/ {/ p# E& f2 q/ i: | BSTR strD = strC.AllocSysString( ) ;
% |5 h7 A, f) {+ R3 n7 B7 [' f- W
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。3 ^4 x* X( \' m# i) v
1 v3 ~/ V% v% n$ Q) j7 N; Y W4:UTF-8码转换为一般的字符串:* G; n8 E9 B, }5 E
: v$ a0 x8 d; \4 f' @. o7 c9 w#include " Windows.h "- x) G+ {- `" T' c& l$ K2 W, {
. I' X7 p! O! b3 |, z$ g ! d2 _8 Z/ {! q3 p. G k4 Y0 a
; e6 Q$ ^$ f3 Q
int main(void) i" r! J7 I' l4 [ o: ~
- h( |/ a8 b% j1 Q' M" O
{. [) D5 r- a3 B1 A0 u, p1 l; K& y
: {; K: [0 B% W2 ]! {+ r: i2 P
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,
$ C+ `& _+ P! a& ?6 }- _2 h
4 I4 h$ s8 P9 @7 I ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
" o: K1 s9 k* a2 {0 f& F; X& K7 l \" E j/ R& U3 a5 J! ?; ? [" ?; c
WCHAR* strA;7 U9 i% |1 C$ r D
& Y2 ^* A' t5 C
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);: g" ]; [0 W; J. v3 ?, y$ T
F( q& C8 O# ^
strA = new WCHAR;- ]" q" }. `% J, ~$ |* V3 |- j9 @' k
) q" }( Y% G& b3 L2 B MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );7 a* g( m, F2 K& T- m4 z) J- v
8 j) s& C6 k4 ^0 p& x8 H3 [ i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
8 P+ q" R% n% {. y1 ^" @* ?0 f- H- R/ _
char *strB=new char;! ?, c, z2 a5 Z
8 C$ C6 U3 p' Z }3 w! O; J* j& Z WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
7 X; ?. `% R: ?" R! K! L: ~' y- a0 q
//strB即为所求5 v, t I. e* H4 K3 d0 A
0 B1 Y$ V) t, z& R delete []strA;# T0 a X( }% N: Q* H4 u
# b# R5 Y, z9 D2 P9 C7 H
delete []strB;( G. O' ~5 T0 n9 \3 |
; _/ U B: o6 w
return 0;
2 F3 Z+ n; b! }/ N. C4 |9 y1 {5 }9 D/ j) ?% \$ k% a6 m3 a ^
}
3 v4 R7 z" t+ N% M4 c2 z5 Z& g( g" a- B; [3 i5 j3 {9 U
5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
0 C- i6 v, A5 s) u) \2 d; y! ?0 [' v7 @+ q$ y+ N: S1 d" [* s
#include <comdef.h>& L( L! B9 f2 L6 i
% B4 r3 _1 o" N2 A J! n# ` _bstr_t strA;# \4 K/ x! b: c3 f! S# V
! |: [0 a' X# ?2 K3 H% x
char *strB="中国人";, ^4 i, ^. M( x! h2 b# F- f2 Z1 a* C5 v
; j3 M* N2 s: ~# V& L
strA=strB;: G8 t8 D- Z" Z: T8 p; ]0 {& t9 U
6 b9 H) [5 D$ I
WCHAR *strC=strA;+ j$ T; |1 M1 t% w0 ~2 |
* n* D4 G) R1 a! L# G
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度+ X* L7 R. V3 x& A
+ I: u; E$ t$ e
char *strD=strA;
; l: I3 ^1 O5 J' @1 N
. D# y2 d0 A+ v8 M# U return 0; |
|