|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。% R; {1 F2 o, f3 o8 a6 ^
1 d$ Z" s% T6 t0 @) w
2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:& Y& }( o. K; a6 B- E
. B+ H3 |6 C2 k1 E4 y
WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
: m; K$ z8 V' R- p+ g- y) [, W" I9 U, E& j8 T
WCHAR strB [ 2 ] = { '中' , 0 } ;
c& K. ~2 ]# Y2 w3 G
( M* S2 A- }& u# N7 t CString strC ;
6 C6 r$ I. f5 o z% J" E- d" o, L5 _' y0 p8 b5 w! v( a
strC+ = ( ( char * ) strB ) [ 1 ] ;
! k: K9 ]0 L% ^& i
" o, I9 A/ o s: [4 j strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”1 c& Q( a0 ]; [) @& e7 e
! q% q* E3 t' L+ v. r) a3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。9 x2 B6 M3 Y6 k, M3 r( X
2 T) ]9 h" y( z% T: Y7 ]' K
4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
" L% _3 W9 ]7 W, ~- X: C
9 x4 [: X f8 ~2 M; o q CString strD = ”asdf”;& k; }- V, C& k
& M, {2 R2 V' ^5 f
BSTR strD = strC.AllocSysString( ) ;' P( Q% X& F" \$ s/ [# ]2 w& I$ J
/ ^1 k# [; z( [/ S+ O5 L w3 w
long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。
* }2 Z' z7 L: M$ ~* Y) \8 z) X/ p, P n, |8 X9 m W% {! X' {. V
4:UTF-8码转换为一般的字符串:- {8 w1 @' y* Y, `6 i/ [8 F
8 o' o/ S' {6 Z- `* e#include " Windows.h "
: J- Z2 i( o% D6 t
- t W0 {% `% h) J
( \. j- b% ~2 R2 A) [) [
8 R, d- _; Q# Kint main(void)2 h1 d0 S) j b
$ K, \6 \! ^9 i* j{. Q" S% m7 K, O1 B4 k
: n8 ^5 R- _1 M' s u char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,- m) @2 U# j! }: C/ m' ^, ?* j8 S0 U
2 s! a d! x7 t- i
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码0 y8 i( _; B! z/ S
( g; t* O& u- t0 i
WCHAR* strA;( Q/ U! ?3 }1 n9 ~, M
( f" e5 `4 n k; n0 o7 p
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);, g( [* Q( w6 \; m# k- V6 y" k
# M! [# O' M- V
strA = new WCHAR;+ S% l, l* l6 ?) R" j
- n& `: D9 E- T: ?, ]
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );1 z9 ~3 ~' q( v8 r
# v& Q$ t% y5 ?& }1 a i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
8 _0 [7 x) M) g( G2 m6 p$ _* O
3 _% f& c T6 t( _; b char *strB=new char;
9 w9 ~! B' J, S6 R" n
8 N; u" O" _' S2 O) S# }" n2 q- b. j WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);: D6 ]# a/ S( h3 H2 r
$ A3 f0 d8 I4 ^& U
//strB即为所求1 t$ D ], T5 t, a; f. q
! k& z% p, _8 U+ h/ t$ s, o delete []strA;; c2 A# G0 j1 J7 A+ J) ]6 J% R9 Q) d
3 S. w/ p+ Z$ B$ L6 z2 n delete []strB;9 }2 E% j4 B' T7 C' |4 a
3 h: J4 T5 n' E7 o, h0 Z2 _9 [ return 0;2 ~* j) l# A; e0 j
) x5 E+ E" N C1 y: [0 X: s+ M6 T
}. D9 t5 E, n4 y n4 |* B% }
3 w: s+ z O7 W
5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:! f. `! u6 u% e8 x" |! w
4 V* `0 d. {2 \, u! @$ J
#include <comdef.h>
9 ?$ l" ] Y# f8 q8 v, Z3 n
& ]$ t, x% m/ g3 A$ ^ _bstr_t strA;
3 c) V( o5 |9 W& ]9 r& b& \1 j7 X! w+ ]+ k8 [9 \6 Q* E* y4 A
char *strB="中国人";
, d4 `0 N% t5 s( h1 }1 y5 z: q
2 g4 | p8 w4 S5 [2 E strA=strB; R C: H, J& _, k% u1 R# q
; P8 j' f6 z# B) U8 C o! Y; R" Q9 h- \
WCHAR *strC=strA;( j$ a% n% O6 j2 J3 m- `
$ Z o- O+ w7 A5 u, ]
long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度
! E% I/ F9 K0 s' K+ l7 y
' t* L- ~; \/ H" s char *strD=strA;+ U5 L0 S% o; R' x. Z
s k3 V/ E2 |9 i/ \7 Q" @- q return 0; |
|