|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。5 A6 a- [" z) I# h! F% n
9 h& [6 ]/ A8 G$ m5 Z" N2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
4 U; w' X" h+ p/ j! S5 |
) Y) }, q* y1 o. k; H WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。, ?' g d3 a ~: I1 Q9 ]7 M8 r" ]$ l( |
. k8 }! m. R A* L WCHAR strB [ 2 ] = { '中' , 0 } ;
4 J; A& F! a2 ~- L1 V; z4 q6 t ^: j) L; a3 n. A+ s
CString strC ;" V# c" _* D8 P: I( q P% l6 n* g
4 y" s( ~4 G( Z8 W
strC+ = ( ( char * ) strB ) [ 1 ] ;% x( U9 ~3 |4 Y$ H8 f5 r% @* J$ ^
& I* {3 b& Y5 u strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”) H* j# ^3 ^2 ]3 q8 o# b R
+ E" g. a, Z4 ?4 y' S
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。7 h! B- i) @, o9 k
; c* z! a4 w; s! s4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:# `, Y8 \1 S; P* n" M
* o4 X% }* _! f; V7 ^2 ?: \* u" m
CString strD = ”asdf”;
+ h0 o. I& @ J$ b$ v
8 e# ?3 E% B7 a% L" q BSTR strD = strC.AllocSysString( ) ;7 N: u1 C+ @6 h: C# z- y
4 T& p5 d; F: t1 Y# E5 q* A7 V
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。0 `; F/ l1 I0 y! `2 s! w( S9 f
1 s9 J, M: E: t4:UTF-8码转换为一般的字符串:
, F" i2 Q% v7 E0 }* D! Y/ ~* A. R* }5 s3 O5 ~
#include " Windows.h "
" c" @# H# F. s# p2 Q! M7 h: i1 [/ w5 f. S# k1 g
) }- {5 |" ^5 Q! G7 |8 r- t a: d/ C6 v3 y# u
int main(void)
$ S3 k0 d8 `/ V+ d- V! K; @5 z% Z0 ^
{
* C- m% ~7 b! t v
9 ^- P6 A0 I" S [2 S4 N char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,8 d7 z! w" H* K) D1 K
- |3 z- E/ g* B' ]+ b ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
* \8 N/ C, P& v
1 a8 J# {9 b7 q4 r Q WCHAR* strA;* [* P0 ]# _4 @0 y$ {; a
/ h' R# s2 ^. X8 x int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);9 v$ z+ |% b, Y) A$ y1 ?
# B8 z8 r' v& k4 G6 n7 r( Q* u
strA = new WCHAR;
4 ?" H4 i; ?: \2 E$ I3 a w+ X6 Y* `
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );( j n# K* @ z! _7 q
# _# B! j6 m: a& U2 `9 |
i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);$ q0 ?. j" M7 Y5 {7 h0 G9 W1 n
! O7 d) n: V. F3 {2 j, R( E6 f$ k6 i
char *strB=new char;1 Z, i( j0 d+ x/ I! A5 u, F# u
7 w7 d% G3 g8 ~: |- H, n WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);4 R4 D- c* h$ _' c
% _8 R K |; g9 \4 A
//strB即为所求
7 E3 Z2 g+ F/ h5 E# U4 |- d; h3 Y" ~" O1 j! _
delete []strA;' z* u0 D2 U; S" F C( w" D+ P
9 j: e% Z& n) a3 p) `' R! F3 {
delete []strB;8 C9 z9 |; F2 X# I+ n& b
: ~ _$ ?4 Y5 H1 m3 a( J* W
return 0;
* w& @' ^ J$ r1 [! s: l
8 z' E' Q3 H; Z3 j7 s( k7 i}
. B0 T# j% Z6 P0 i7 F- U4 j
A# x( W Z1 H5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:
1 J+ V6 ~8 o( p6 u9 m# Q* Z: Y
- ? W9 T" x) G" [; Z: | {#include <comdef.h># ]# q1 `6 B4 W
/ n4 n+ y. y/ H7 P+ B& k# \) e9 p _bstr_t strA;2 O& I! k( I5 e0 z
2 n! ~* Y0 U' U: Y5 U/ j. ]
char *strB="中国人";
5 a& Y: c e6 _& ^* `8 W5 B9 j# c9 ~. @& Q1 E1 L9 Q9 R
strA=strB;# h6 w# D+ e1 e6 ?0 l; g
7 [* |9 @# f' O5 ? R$ k* {2 }
WCHAR *strC=strA;
9 P+ M# m5 p( f) H% |7 ^* D
5 X& |9 F! t( U; g! n long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度% B* n& r. l8 t- E
H/ L% ~0 f, P# y
char *strD=strA;
2 \. `3 P! B' a+ e) `& _. \% d
! d* _& F: z5 ^ return 0; |
|