|
|
1:使用CString,要包含文件afx.h,比如在Win32 Console Application中Alt+F7选择Use MFC in a Static Liberary,然后再添加#include<afx.h>就可以使用CString了。' ~3 D8 Z# B9 J9 @0 g
7 [9 Q6 T6 G! [/ l/ U/ u- Q2:WCHAR ch = L’中’;与CHAR ch = ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如:. q L! h0 p* j& L1 M
- M8 q# f+ D2 \3 l% y$ [* ` WCHAR strA [ 2 ] = { L'中' , 0 } ;//打开VC的Options菜单,选中Debug选项卡中的Display unicode strings后,可以看到strA的值。
" g0 [8 O) n/ L/ M( K8 X; S: ?2 e5 O9 N( u1 T
WCHAR strB [ 2 ] = { '中' , 0 } ;: ~- y2 M8 O* ~3 n: U/ p/ Q
0 k3 ^ P' O; \- _0 \3 |4 t
CString strC ;
8 B' ^7 {' S$ c! P2 [% j" g. L$ I, x+ S6 G8 l( v! D, y3 P/ _
strC+ = ( ( char * ) strB ) [ 1 ] ;
$ Z3 g- i* m6 x; r/ }$ B' N$ D+ U/ d5 K% v5 Y2 F$ l! I- ~
strC+ = ( ( char * ) strB ) [ 0 ] ;//strC==”中”; ~ W6 R/ X: r
+ r) W7 Z* Z d9 t! ^3 d" S5 x, y( R3:CString的AllocSysString ( )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。! ~2 K6 g. A W. h, c: @) h
2 Y) J9 F0 {! K6 c$ ~4 _3 U4: CString::AllocSysString ( )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度:
& q4 x3 c4 o/ Y+ V+ B1 {. I% g1 U* | p
CString strD = ”asdf”;
# H) v7 f. R- @3 {" r% u) _* f' T: X
BSTR strD = strC.AllocSysString( ) ;
! t/ I6 ~- p% C8 {0 M
- a2 f; y Q, s0 ^. A: w1 P6 Q long i =* ( ( long * ) strD – 1 ) ; // i == 8;一个UNICDE字符的长度是2字节,所以strD的长度为8个字节。( C$ K- ^& Z" v& l7 T0 W/ o
5 Y: l. s, h# X) b4 U. k
4:UTF-8码转换为一般的字符串:
7 i' e8 _ L1 X, E) \ \. {4 \+ j/ {
% {0 i( w( [/ z1 N1 B#include " Windows.h "' {) z4 Y( \5 B* y6 A) E$ }
, m- D: H" w7 e 5 ^/ G* `# b0 r8 \$ H, J# s y. u/ k
, P" m8 c' z8 a
int main(void)/ {1 Y, O4 X# @1 V' C2 }" Z/ r5 P4 D4 n
) j. I' c- O! k) G
{
# o1 ~* \7 E: z5 v+ O
3 z f9 b/ r+ f( z! U8 W' \) y5 j% W char str [ 256 ] = {( char )0xE4, ( char ) 0xBD, ( char ) 0xA0, ( char ) 0xE5 ,9 B; R9 w6 `: x. d1 x
/ L1 ?' ^3 b0 u
( char)0xA5 ,(char)0xBD, (char)0x61, (char)0x62 ,(char)0x63,(char)0} ; //一段UTF-8编码
P- B5 i; w& S9 _2 h- i" S+ V: n' v" c
WCHAR* strA;! |' ~' W d/ Y, \8 k1 m, K! d
# L( o2 A7 _& A4 R int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);! ?1 }" V8 u6 o6 C0 T& K, P
% V }8 a& V7 q( F4 t/ p
strA = new WCHAR;
: H! _; y0 g- K! @% [1 m
( t& l9 z. m6 K2 [4 ]2 R+ E7 i MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );/ j) K! C' L; ~7 p6 {# b5 v+ n+ V
0 g) [8 P. s( w1 H9 W3 |$ x i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);1 \$ R5 ~6 z' S
: C5 Q* P3 m+ S; `# v9 i
char *strB=new char;
3 ]* C& G0 W5 [7 h0 Z1 j2 o* _3 ]& ^) n& b0 r
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);$ q+ `& |( ?/ a5 {0 ^
) X; T- q8 _' v8 L
//strB即为所求4 \; {% g% R/ W% X: g
; V' i9 R) C1 ~ delete []strA;
+ a& x: v1 U5 v( j! _% B* r7 j. L2 o2 F" F
delete []strB;
, R4 \. X3 v' V' A0 ^
5 i3 v" ?: \/ E+ p K4 @( L return 0;
1 ?( j6 W" x' J, H5 }- H7 l/ l( r/ ^* m* a: V/ G" o
}- B( y7 v* U8 Z/ d
/ T6 {6 l8 {3 ]. E9 N5:在转换方面_bstr_t是最最灵活的,他提供了UNICODE到一般字符串的直接转换:! A2 R) Z) b: @# S
' L% F C. Z0 @' G7 S( G#include <comdef.h>
8 R7 L0 Z" i3 P
6 X7 Q. C" p( q" S4 B9 h D J _bstr_t strA;' s/ S: j+ u$ B5 d; Y, _8 D
* {( z) V0 ^) D5 X" [ char *strB="中国人";
* Y6 {' y N; d0 g1 \: ?& W/ {8 L- Z$ R, i
strA=strB;+ Z% Y5 d9 g& u/ z, R# K
4 T8 F: q2 |4 K/ v7 } g
WCHAR *strC=strA;( o2 v6 T2 D" A% G) h: E6 G
/ a$ a- I6 z4 W- C long i =* ( ( long * ) strC - 1 ) ;// i 亦是字符串的字节长度* k2 U5 [3 @: Z' J6 a) M* j; q& a
/ N" D6 e+ Z: M( d1 y: C0 C char *strD=strA;8 I' C ^ ^8 v1 e! V- |# v
$ P8 z5 f2 Q- ?2 h0 b return 0; |
|