|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。' c3 b9 E6 D+ y: B0 g9 D
1 P7 D# r) J- P. Z# t/ [1 U2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:! l& K, a, [9 _' ?0 z' v" e* M
) z+ W( N; }% |$ V! h WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
# M- ~3 J3 N2 p) A* {# U/ i
4 C2 t+ [# K& ~. e! ]9 B- _$ O+ s0 C( M WCHAR strB [ 2 ] = { '中' , 0 } ;7 ~& y* g' e. b2 P. a9 F! N
) g4 b; B) {3 b$ l2 R
CString strC ;
. Y# L) a# q* v( l5 M8 i. B# t) G9 q; b; _& s) H; r
strC+ = ( ( char * ) strB ) [ 1 ] ;
& @# L- n4 m7 j2 J V
3 F; ?1 `) O& Y+ e. Q strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”# `7 m! N5 \( e9 Q
: O, o9 q6 y( I9 X( \7 [8 w3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。( F9 P7 ~3 H/ n+ q# u
" t1 \3 R" O$ v# @* F. t$ w x# b4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
# R3 R8 q" D% I( M
" ~7 T# P% P G1 H# w CString strD = ”asdf”;
! Y$ i% u3 K- C( A
* W. _0 a" _9 C6 `" n3 g BSTR strD = strC.AllocSysString( ) ;
2 k; o3 _3 |* b: ~3 x0 K$ ^$ \( x
# o, `+ {! r( u' I# q+ Q0 s long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。- Z) i8 A2 T4 Q+ l6 \# y
" X% M# C) T: y- ^* g5 Q
4:UTF-8码转换为一般的字符串:
4 `- W/ \( I, s8 k, K6 O0 o4 P8 W, g: B7 h" f, m
#include " Windows.h "
% `% n- q6 D$ M$ G7 d) ~- @! [( g2 S1 U5 ^& F, s/ V# i" Y
0 \2 `1 ~8 ~% _+ _7 r# F0 J9 {/ H* U& ^5 V0 [4 j* q
int main(void)# t; D- Y3 R: m7 Q. a u( ?0 s3 o
! t6 Z" J( k4 Y5 r" Z, }% f
{
4 Y& S( ?) i* S; R
" I3 a5 o4 L3 a. c, I% o char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,# j7 n: s7 F% d0 j
. W! S2 \" n% S& C* O! D ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码) b' @7 h' R6 U1 a8 V- \
4 d8 u! ^/ l; K' F l5 q WCHAR* strA;3 k( n9 e/ c7 H
, f, P3 k8 Q- ~# B! @( { int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
) A# J+ D, Y/ L; ]1 T* D3 H5 K/ v& ~
strA = new WCHAR;
/ N( R" z- {1 n) q0 d9 j3 g% s* ]- H- f# S9 Z" ~" a4 j# C
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
" V, t6 M2 h' K) q
8 V* P* H# i7 K1 ` i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);4 `- ^" b2 M% \
! ?( [& j M) @, H- a char *strB=new char;
7 }% t' b* p; U
w+ y, r; W* O+ L, X WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
* G0 G+ Y1 a+ G7 j) Y
0 o4 b: ]" d# k( J/ j//strB即为所求
3 b6 s5 I r5 S- j9 L3 N3 {
1 U5 S$ I, l! Y2 z* g6 ]/ \ delete []strA;) Z$ S$ R. L7 E; e4 V9 l
$ ^# ~# S; y6 ^; C- ]' ~9 `5 e
delete []strB;, U/ Z: P: V& ~: k6 R
& q, @0 n, G% l3 E$ t5 N
return 0;
3 k# x4 k) `( C) E; U, F* q2 I9 O4 O
}
( J2 v9 M% V( r7 ~# d
! y* m: b% ]) h& s: |, f! R, ^5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:$ l0 M; E4 p5 e+ s5 n
3 A j& x3 ?: h( `#include <comdef.h>
! T# A3 C& C: w6 f! j! B
% c) o( h6 U* l \. b8 h: o# [5 o1 i# }! K4 V _bstr_t strA;
2 {% B' n2 C1 @) h0 @0 Q l
, e- D2 _/ {% v E' ^5 k char *strB="中国人";0 A w" [' L( u
6 z9 ~$ P- q |
strA=strB;
, d# H1 p/ n# {* }' [' R6 J ^6 C. v4 J. M) p5 ~: e& \% X
WCHAR *strC=strA;2 ^# c% M9 i: k5 X: F, I: c
8 G, s. c; c: M2 D: ~/ | long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
0 I1 s# q0 {$ p/ N' b3 s$ u/ v; _& ]( k# C( @0 ?& v* w9 G. b6 ~
char *strD=strA;
7 \% k7 Y. p) \
( M( e: ]8 _+ X+ ^# O9 {$ p8 Q return 0; |
|