[报道]重新报个到,申请个新人成长礼包~( s0 X9 f2 w3 J. {" [6 A, {3 n
0 K' |# c. ]5 W. L* P' u' f0 P0 ~" j
灌个水吧..., A" p: m+ M7 i% O( @3 r8 s
/**
+ Y7 P6 U! z) I6 L*@file 3 j2 ^: L8 D3 s+ S8 D
*@author Jimmy
$ y, I7 U2 N, u8 l*@date 2007.1.16
- h- ?; D" \- n( {; w% R*/# K3 d% k* Y. ^6 G
#include "utf8conv.h", e# W( n5 L; u A3 O
! {" i$ H8 j5 n1 O. U
6 j; ^3 d' n! r I
" T/ ]/ D k, L* T6 e7 J
int UTF8Conv::codepage(const char* code_page)
. C$ t5 z0 V. \+ @7 @5 z{ 2 d5 j' Z @2 M3 `' ^3 h6 R% R3 y
#ifdef WIN32
& \' [3 X& A! H. _% C5 p) R. P5 | if(code_page) D& g9 @, t+ j N6 P
{ 4 ~* O% E' r5 y7 T& g
return GetACP();//既竚箇砞$ d6 w; J* J! r: |
} & r% \- w% R! E8 L% D7 @6 y
#endif2 @8 z% X! _ U- z/ q
return 950 ;//taiwan acp
! L0 _: y& i7 b1 h) g B }9 o}
0 h# R% R5 B0 f) ]6 U& U; c9 ~! W* F, n1 J2 \& ^
5 n- ?1 {8 h4 \% p5 W
int UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max). G+ F8 q& w# m G V, u
{& |9 v0 E: J' W: l4 y" E+ t
#ifdef WIN32
4 k& p& [2 p: |& s return ::MultiByteToWideChar(codepage(code_page),0,in,in_len,out,out_max);/ d4 [1 Z- w# G9 v
#else
9 P- l1 l, `9 [ size_t result;
* A7 x0 a" }' G0 k iconv_t env;
X0 c/ t9 Q, f5 u+ P env = iconv_open("WCHAR_T",code_page);
7 R5 Z2 ~9 b. Q% F result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);
! a# ~, S; H# B( } iconv_close(env);) y' O7 v$ N6 E4 G
return (int) result;4 t. D6 u, @1 G x
9 J: ^9 T8 v, a# G
#endif ! _9 u" Q- e) L. _' g u
}$ X$ }6 Z% z! b. D
2 _/ u8 W8 H. h7 x( _0 J
int UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out)
$ h7 l2 K# g- L% y3 k{
0 C, u/ K, J8 Z: ] int len = in.length() + 1;& L" j( `* }7 }* _; J; d9 H
int result;
l8 J( O6 E+ Y9 d9 | wchar_t* pBuffer = new wchar_t[len];
/ b$ Z5 V" \7 X memset(pBuffer,0,len*sizeof(wchar_t));4 K7 K- x+ c7 K6 s% M. K
result = dbcs2wchar(code_page,in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));
! M) f8 J! N8 ?' ^ if(pBuffer >= 0)
+ L2 w, p4 r; R2 Y, o {# Z0 x5 V/ h5 U7 u* P6 Z' S
out = pBuffer;
. u* X( j. \; H2 i }9 W3 ^4 w, B/ ^! r: Q; N5 G6 ?. T5 R
else* f6 C! C1 y! }
{# Q( u) E6 G/ R5 E1 n$ I; }
out.clear();
, Y6 ]- }9 j- u0 c' W9 Y }
9 B4 ?( s- j, E delete[] pBuffer;
/ K% e; G4 t$ ] C3 @. s return result;2 X! ?& F4 j$ ` v
}$ T1 W; ? t8 x1 W( _
, k$ i" F. o3 ~4 n5 T; Gint UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)5 o+ u8 R: F5 h5 X9 U
{( u2 w' W2 _5 o2 u: N V- ^5 e5 J
#ifdef WIN320 |( @3 x3 _4 _, O4 B
BOOL use_def_char;: b$ ~. d9 X4 d; x
use_def_char = FALSE;
! j( Y* j% u7 c% W return ::WideCharToMultiByte(codepage(code_page),0,in,in_len/sizeof(wchar_t),out,out_max,"?",&use_def_char);
Z: G% L& \5 A" f4 ?#else4 \8 ^' V6 x6 T% M( k' b7 d) @( g- U
size_t result;
) G4 m; x: D! w) F9 s! I! Q iconv_t env;7 u. J2 }5 N6 R) ~# D
env = iconv_open(code_page,"WCHAR_T");
7 p3 M" t3 l: q. y+ N result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);* N; q1 g8 y S% S" m
iconv_close(env);1 ~9 j8 N0 Y z
return (int) result;: ~0 ?1 ~, N: g4 z; m( m$ ^ c
#endif
% g# E# h- P. Q* U8 @+ E}) o+ N9 Y8 e! x! c) o
2 _0 s( F, j3 vint UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out). b1 |+ s6 f& K# o
{1 q0 j2 P, x$ y5 f5 n$ U, w, H
int len = in.length() + 1;- T8 A o, s9 ?7 ~5 E% ?
int result;
5 }+ ?( m5 J3 `* ], A9 R! e2 y+ O char* pBuffer = new char[len*3];
B* m7 G2 q6 ^0 f, n memset(pBuffer,0,len*3);2 a" }) _2 O) h' n0 }! E
result = wchar2dbcs(code_page,in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);# |6 z( |; q: x/ ~" N7 l# X& Q' z
if(result >= 0)
3 M5 d3 a% |/ |8 i m( h. O+ D { . G; m6 B8 C6 _3 ^2 d
out = pBuffer;
. R* P5 j# p: u- G: V }
r' l6 W8 _$ a. | else
1 a3 p5 m# `" ~2 P) g- j: R {
8 L6 L( `3 n- t( B( C out = "";
q7 b& P/ ]8 Q }
- B- Q* d4 V w g! L delete[] pBuffer;! i3 L: S0 G& x& h) u# Q
return result;
& p; U2 G' T% M}
" M/ S, i/ D' p6 _/ t1 [3 X
- n$ p: E! q1 Y/ M2 Q: s6 h! Xint UTF8Conv::wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)+ _& o! \/ p- U6 L7 n( V& G- R. L4 O
{' { ]) B/ E9 Z4 D
#ifdef WIN32
- v" d- D) k/ K0 N
/ o2 @2 ?' |& d0 X6 @# R" k7 o BOOL use_def_char;8 K7 B1 I: {9 F0 c
use_def_char = FALSE;
: A C/ C0 i c9 k. w return ::WideCharToMultiByte(CP_UTF8,0,in,in_len/sizeof(wchar_t),out,out_max,NULL,NULL);
( ?& K% o. B- q8 u- \3 t6 C#else
/ x7 W# X, p! @' M; ^0 ]& t; `. Z size_t result;
2 s, ^8 O* y3 p) ]: s; G4 X iconv_t env;! |6 ^4 v I' e: f o8 t3 G0 u
+ h" T( @! j1 g% M# R
env = iconv_open("UTF8","WCHAR_T");
" C. E Y) f* _* k' ~ result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);
) u# E2 h# I8 R, P# O1 D1 P5 W iconv_close(env);
3 r) n4 P! e3 c1 e0 V; g return (int) result;' T: s/ `5 m; ^ ?7 q' n4 }
#endif/ U/ p2 K% c* S1 p2 f2 D3 s
}
8 V* A( B0 `3 E& Y# e$ }% ~! \8 g3 ], ^0 t4 e5 f' T' `
int UTF8Conv::wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out)
' p- U, i; f% ?+ D. W L{, M# Z7 O; g% F4 H, c
int len = in.length() + 1; c$ O4 |3 ^) a; m1 [# h/ P" q7 E
int result;
* S3 A3 K; e& J; e; W4 T: t5 M char* pBuffer = new char[len*3];4 A1 W6 B) `2 j/ w6 e
memset(pBuffer,0,len*3); 3 y( I" J3 D( Q- ~# F) S
result = wchar2utf8(in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3); 0 j2 w$ Z' z a( @& Y1 W
if(result >= 0)
& s, E- _! g$ z c- ~4 d) D {
( A& M: }2 y4 {, Z- U out = pBuffer;
! X8 Y3 u4 c% C' y( B( } }
% m1 e- |' w/ q8 K. D8 x( m) ]- k+ r else# d9 Z2 v- Y& H: g% h r
{" w, z3 K! d# V% ~0 q/ _
out = "";: m3 H$ r) _: H# @
}
# t* `* ?5 `$ _$ B7 ~! Q7 x a, W3 C1 T delete[] pBuffer;
( N p# n/ A9 k0 e4 h9 b7 m8 p return result;( P- `, p* ^$ W
}
. V# e- e' M: K$ O' q
J% B( i: E8 E0 B( F0 ]* B/ Oint UTF8Conv::utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)
: r8 ?9 ~- O- l" s: s8 s8 i{
9 n% i) v" u: |* e! _# w9 p# P#ifdef WIN327 i$ E! c: K1 |: C. ?- P( j) J
return ::MultiByteToWideChar(CP_UTF8,0,in,in_len,out,out_max);
( C: q5 }) F: L7 C( ?#else! q1 K. B8 T& G: v( N) x# J
size_t result;% `1 n" t) H7 B) ?' j9 w3 d
iconv_t env;
6 ^5 P5 K9 e ` env = iconv_open("WCHAR_T","UTF8");
4 P7 X$ V& f1 O7 V6 r: U result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);+ a0 X4 L* S( }5 Y( I4 ~
iconv_close(env); ]6 v0 U& I) |: N3 B3 p9 z
return (int) result;
2 a1 N4 K+ W% w#endif5 n2 Q7 x) q7 M$ `& O( A
}. p& ^! \ k7 }$ v
# B6 i1 \$ |+ N+ m7 A0 e
int UTF8Conv::utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out)0 Y5 i: P. X: f; T$ H$ G. b: \8 U
{
4 `, E z7 T; _+ ^* e int len = in.length() + 1;, P* O- [: k0 u2 A' \8 i1 o
int result;
i2 K" K) o0 m7 K7 ^* V; ^3 g //wstring temp;
5 X# e# O$ |" t/ I wchar_t* pBuffer = new wchar_t[len];
, V. T+ U" Q$ [9 R; k- U/ r memset(pBuffer,0,len*sizeof(wchar_t));
0 o; O5 x5 U/ h1 ]3 G7 B result = utf82wchar(in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));0 z5 i. o# T7 H+ m/ c/ K% }8 r$ c
//printf("utf82wchar result is %d,errno is %s\n",result,strerror(errno));% j! Y: @ K2 u" f- b4 Z
if(result >= 0)1 o6 n% }; z3 g8 [% i
{. _# m7 `! _1 J0 H- F) G! y1 P# E! r
out = pBuffer;2 U3 n( P7 Y7 X5 u
}: q. T- q2 o3 N% ~$ a" x0 d* s: B
else
b j' m1 n0 Q" h1 z0 N% _" i {
( w& I$ ]8 b% K C; Y# v out.clear();
0 a/ S; c1 ^( y. z* y+ { j$ ~ }
! N( E! H3 _2 _3 O delete[] pBuffer;: G Z8 n% p0 v, b+ F: H
return result;6 u5 d/ x& _0 E4 w- i, P
}, N( b% g, s) b% w8 Z
0 j+ W3 M2 ~6 n1 R/**
# i- g: p w% N9 _6 p* {% C- B*@file 2 f) F% P- U; Q
*@author Jimmy4 Q% |8 V# @2 b- e4 N( {
*@date 2007.1.16" B" e" i; g! y! b/ f
*/. S) F$ i" Q; x+ U% ~4 ~0 b
#ifndef _UTF8CONV_H_
$ J) T+ I/ g) w- q/ \#define _UTF8CONV_H_6 H( p4 c( S6 y6 b
/ Y7 i) L: Q9 V1 N" \. y
( l7 R5 A8 H+ u9 L! z, S
#ifdef WIN32
! S4 Z3 f5 S7 R* @#include <windows.h>
/ X1 Y! O7 K3 }, i#include <winnls.h>
7 E) e# E& ? O% T#else U! w) L) ^3 c5 k) T6 s- y
#include <stdio.h>
" t3 F* Q u7 W3 m) M' |/ w5 r- [#include <iconv.h>, I# B: b. ?+ M4 c
#endif/ R1 _. d! @" V2 v5 {
% o! D% J0 U! T9 h" q
#include<string>/ R7 f! e8 O; F1 K4 F
0 O$ {2 t* s; E7 K9 u
# f; j. H8 l9 G/ k1 }9 k+ G
class UTF8Conv
1 r# m8 O9 ]- k; d$ p {) E( Q1 ~- Q% e7 O1 Z9 s
public:0 w( W. l% g0 q* o8 j7 r2 [
static int codepage(const char* code_page);( d. E9 x. ]" j0 x. _
; `1 d# K2 K: A9 B4 t4 M F static int dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max) ;
) N6 i# m8 s1 W$ Y. o! Z' e' E- i+ Q" _7 _ [3 |. }: ]
static int dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out);/ Z. R6 |# G" O3 Z/ S4 r9 e, r
: @1 Z; ]$ Z. d static int wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max) ;/ p& H* T* q6 h+ D2 x# Z/ D/ g
8 p% z {% s, z6 D0 f( | static int wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out) ;( y6 N' w" r5 P
7 U0 |. B. M6 H( w static int wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max);
) s' f( s# C4 c1 B" T1 z% d: a' M, W4 N1 l6 z; a
static int wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out);3 m( }6 t2 b" X' N& R8 y) h
, L4 o+ w1 k9 a0 ]5 s5 R9 |
static int utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max); e# s3 U& l, L+ M1 d: O
1 l( a+ V' ?& D7 d" c2 \ static int utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out);
+ y# e6 @; k9 X% u9 \5 p, Y};" a/ v7 K$ M9 K2 _7 F3 \- [
* A W, ]: ]- x+ a+ s5 D( H& h; Y+ l: C2 O( H
/ S1 g$ V% K2 u. O0 H7 b
( M" l0 c: T+ X. m/ a5 d- @2 ]
5 S# V4 T# R ?3 z0 p) t4 O( N) K1 f: J, R5 O( Y$ O8 E' i
q3 J* |$ Y/ R2 D) G' g8 K% |( Y2 |# y1 n( A
4 S) T/ y4 |# j( d- m$ g h& D
$ O' q: H' F( V9 K+ O& E, N1 ]% A, W
* x7 w! x% r& m0 Y# ^6 `; ?% }) W' |
" Z$ S& d; Q9 K; N! C9 w+ L5 y. G8 X
5 ]' x( ~# g7 h' {9 A7 F' n# p( D& w# e& C: ^
4 O$ ]+ W9 C9 e( ^+ @& h- N: [# O1 r3 G) O
+ E- G1 F7 ^2 F' k
; o' K x; E8 V* T0 C! X0 p- z) o9 Z# o! k; V6 F1 a6 y
, v9 w7 o5 ~ A& _8 V1 ]' `
8 K: u# d3 n9 A& ^- c
9 t/ k5 Z# _. ?8 Y3 h2 E
$ e% P9 g- S% e; ^, |) ]/ G7 ?
3 s; U+ W% ~4 _, L$ Z* ]) x
$ G& p& @' b$ S0 R5 @% x# ~( t5 o& M
' ]* ]1 ?- Q1 ]2 ]
2 x6 e Q7 l. c+ m2 T5 l#endif |