|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。# Q3 B" x S: _& p
! C" r/ k$ U: |; S) z) O2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:
- C0 D* L) p5 _0 D% B6 w% R
7 j: S4 k7 s5 Y; D WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
+ M! W: I1 }) A- s# v0 s2 O4 \# c4 P0 O2 _6 J
WCHAR strB [ 2 ] = { '中' , 0 } ;" S8 o7 A" m- t% X/ B
1 G3 G4 Q( J* I4 A2 W CString strC ;+ a6 @. H T/ N, ~
! F1 j4 c% c3 T; z% d( }+ T
strC+ = ( ( char * ) strB ) [ 1 ] ;
" `$ b0 o$ C( d. |' C, L! O# {
# e [6 A, b$ N$ Y strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”
9 Q, ~# O5 H& ^! N3 }- h/ _+ h4 x) o) ]- ?* _9 u
3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。
m" Y- T+ i: v2 S3 I3 [9 ? W* s- A2 ]0 c! g# Q
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:* D6 n. _. {7 a h. u- M
- D' f: R6 S, s8 ~8 j& |9 [
CString strD = ”asdf”;
1 J( ?* J# l' W. @* D
1 I) @0 |# ~- O2 v3 m9 {, g' u3 o BSTR strD = strC.AllocSysString( ) ;: B9 Q H' O1 X& M
m9 n7 z. ]$ e+ ?
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。3 ^2 l1 _& R( ?- _1 ]
9 Y3 K* z& t: C( L' H9 [4:UTF-8码转换为一般的字符串:( t' p0 K6 q/ H. i3 M
! H, k; s. }$ H3 U& P5 a* B
#include " Windows.h "2 U* h# \2 n s! h J J' M
& h2 R s! p/ e0 D6 e" [ 5 U( i: p0 j! J
6 S! y9 s' d8 @ T
int main(void)) G3 z. k/ h6 `1 F
7 R: S4 k, S/ J( R, B4 B6 Q{
) _% r1 X4 @. g& H3 c1 [& h' ]( J# g
char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,8 o$ D, X; f& I: ^
: H7 w6 [* w/ Q ( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
: ]! `' D' Q* x7 a0 {7 R
% _: G/ W: F5 K! Z8 r WCHAR* strA;( i3 t( [' j% b/ s, w) k/ ]: }9 G
! D0 p! `/ k2 Z+ O0 G) g' G
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);% g+ I, G8 F$ V) G8 D0 E
4 l2 k" l3 X# q strA = new WCHAR;
* {9 v$ K9 R4 q- i! S, I8 ~4 n) j) k: j5 G2 H# t, x
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
2 {( t/ I6 t G4 o) k. }8 a9 {; u! G( t. M6 m# [7 ]
i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
, V( p' V4 E6 I! s( ?6 m; N- u7 H6 t+ {4 w8 Z- o; @) F. P
char *strB=new char;
0 Q' P& \0 I! t1 ?4 K
( D( \* A. [# r2 h* }) {) k8 Q0 N WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
3 R& I* I0 V" Q! Y2 X" J
: x" s% E: s, V' B0 T//strB即为所求, t& U2 o7 C8 ^: p
7 o) r$ E4 l/ Y. K* B6 y5 |
delete []strA;
/ J' y8 A+ D& K0 F4 Q# n, F1 o
6 A$ \) k J8 H$ o E" {9 ? delete []strB;
3 ?8 C# d9 Q C. h( x$ d3 Y' {% D' R# I6 m0 I: f
return 0;
! ~: V3 n9 i2 n- a2 ^' l
$ K. }% b' |' n}) E! |5 ]3 u; p* L, J
9 z& \, f* O2 g0 X% ?$ O5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:6 M9 G' y+ w& i7 F2 F& I% x! t, }
v3 z* }) ]) P0 x2 o#include <comdef.h>" [+ d5 G' F$ f2 W3 J7 r
* C4 M- b+ |8 U* {7 U6 n5 f* X
_bstr_t strA;2 T" V. o0 @" \
5 w" l% w# |- d3 A5 `, d. r; L: W char *strB="中国人";
2 ?) P2 E/ O, Y& v( [8 |; d2 c+ s9 j, h, P2 g6 x
strA=strB;+ c/ w3 q& m- v( o
' I; \; ]2 J6 i$ |1 h# W' n0 [
WCHAR *strC=strA;- t- h5 _; L: i' r4 A
: { j% ]9 I$ k5 u7 P; s" G5 O long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度# X3 c1 S- I1 g9 `
. J) X3 l g9 M$ Y( s char *strD=strA;% A9 m7 Q) u) V/ \% w
2 X# R( Y5 ~7 T# F1 C" A$ a; h0 `
return 0; |
|