[报道]重新报个到,申请个新人成长礼包~9 P: C4 u7 @% q, i. z$ ]
. N7 t+ e3 Y# I0 r1 |
灌个水吧...
" h2 P. ~* Q& z9 o! }0 g/**
3 Y+ _8 r2 e+ z*@file 7 d' p4 g8 [* T% l% }
*@author Jimmy
% E: A! S5 W' {4 h) u, S*@date 2007.1.16
4 |9 T! [1 e, J3 Y# e*/4 w8 {# k; c ?) b( y9 r% p; Y
#include "utf8conv.h"
w& p; \9 f. {! A) r* y9 ?4 m9 S- f0 {
! i% y/ c2 ~6 I x/ ~5 G* G2 Z3 T! k& S0 U$ B
int UTF8Conv::codepage(const char* code_page). { {- j' {0 V5 n* c7 S
{ 3 ^" I- x Z0 o
#ifdef WIN32
0 |5 }2 m$ s7 U+ O3 y% C0 k+ L& j if(code_page)
7 f3 \ i' j5 K$ Q. O {
' V3 _0 F1 V2 J9 p return GetACP();//既竚箇砞
# C4 D3 q. P/ J2 b } # r) s! V% M) O" ~' v) x: r
#endif
" \: Z( a/ A5 g. D: u2 W return 950 ;//taiwan acp
+ @4 d: Q, J& u6 T4 y% b+ Y4 P}
# M7 i5 k8 s1 W# u& M$ c5 B% C8 Z- s' b% ]$ A4 m6 U
) O3 h: K$ F5 Pint UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)
1 F$ |" j$ n. l" J8 W+ z* B{. [* F f9 b: \* b% V% d
#ifdef WIN32
2 X! V4 c+ Q! E8 e+ O' A* M return ::MultiByteToWideChar(codepage(code_page),0,in,in_len,out,out_max);
7 _$ C2 L0 |4 u! P6 E8 @2 T#else
G( `5 c; D* J; Z: W size_t result;
% O9 q8 D3 Z5 a6 F9 t* w iconv_t env;
. O4 @( F/ Q$ C1 B2 m4 K env = iconv_open("WCHAR_T",code_page);, e2 m; |1 O7 H# Y
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);
7 Z0 g# ^& i) R% { iconv_close(env);7 h; r+ ~8 S: m0 S! O% K, N9 j; I
return (int) result;2 p- l h! ~; E
/ k& `" _9 q! J( J! x#endif
4 U& }1 [/ b+ ~}/ q4 S9 d$ b; P
. z% I0 ?7 X5 `) F1 \: bint UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out): \% U ]: A9 f7 P5 `, c
{" f" T! d: A6 c& t6 X
int len = in.length() + 1;: S: M8 a; c! R. ^( }
int result;* }. g0 d0 x7 L" t3 H
wchar_t* pBuffer = new wchar_t[len];
3 f. d# p8 N5 P3 n2 i memset(pBuffer,0,len*sizeof(wchar_t));" c. U9 p' k+ H
result = dbcs2wchar(code_page,in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));7 T8 p! m9 ?* `! ^. M' V. X- A% z0 A
if(pBuffer >= 0)$ d0 e d) V2 |* s
{# p9 D4 r! R. `$ |: {
out = pBuffer;
, z. |" ~6 a3 o& i" ?+ O/ j7 j; O }
) X: p3 h: W2 Q! @: f+ N( [ else
- K, ?8 t: E ?! _9 [; j5 h# l {; U5 { J4 b( ?$ P9 Q% Z
out.clear();
6 K1 t; n+ N7 ?( y }
- [. t+ ?: W+ u; ~% f+ W! V delete[] pBuffer;+ Y Y6 g# N$ _2 s* t
return result;
1 o) L0 F1 k% ]# C5 G( x}& H% k- R$ x$ a g' ?* n8 W
, b7 J8 k5 ?7 v" c7 vint UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)( @+ T0 d0 ~, B7 l+ p8 Y) n. H
{
0 ~" u) V/ o- C/ @9 r3 \#ifdef WIN32
: G0 j" x/ G$ B' ~5 o* D; J BOOL use_def_char;
! z, R/ m/ x) b: R% L& F% x use_def_char = FALSE;
& ~/ w% z" e7 ? P return ::WideCharToMultiByte(codepage(code_page),0,in,in_len/sizeof(wchar_t),out,out_max,"?",&use_def_char);
s1 t* |* @9 b/ r( i; I#else5 V" B# }: t; u* ^
size_t result;
! J7 h% g$ w/ W# G7 h iconv_t env;* p+ G1 Y {5 @9 x t, P
env = iconv_open(code_page,"WCHAR_T");6 d& `) J! j M$ k3 j$ u
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);- i" |; k' x; S
iconv_close(env);/ O z y" e8 F5 O* o+ A
return (int) result;
9 D4 ~' x/ I+ e2 u; t5 G5 F1 N0 }( m7 Z$ Z#endif f' T' P. C+ E9 Q9 {. r% M
}* d, W( i2 l0 C4 o, [
& G/ n9 d" ]7 g0 l. Z; i7 d
int UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out)
) d. `: N# o2 h. \{ f8 n: j5 o# j q& \* B
int len = in.length() + 1;
1 U' A' [7 U7 @# I2 B5 l1 n int result;( W/ d" {2 X& t" n6 J1 M+ h/ J
char* pBuffer = new char[len*3];
. l* P. y7 ~& v( [. L memset(pBuffer,0,len*3);
! a. E0 q& _2 x6 S6 ^1 @' z result = wchar2dbcs(code_page,in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);- {" T5 M1 o7 N2 o5 }( a- F
if(result >= 0)2 o1 u* [: w$ ~- R! C4 N
{
( x# b2 Z+ j4 y; m ]6 p out = pBuffer;
2 y- B% p) ^* ^: y }
6 V" c2 T: E8 u7 U' P: L6 \' e else
% I) D( w1 M* ^9 E2 d. \6 q7 O7 X {
* y* h( g$ l4 ? O5 d5 R ~5 u out = "";
( u8 v. b& N; X3 O }5 y w3 g% r+ @, z! E! f
delete[] pBuffer;
% R. h4 ~, ~* l+ W! V& w return result;* K6 Q! C+ ]( {; \, r i8 g
}
& G! m' m, j" \4 O4 v
y" M3 |# t1 xint UTF8Conv::wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max), u+ {/ j/ s( n5 v$ r3 F0 `
{* | w* y5 K5 ?+ G) H, i
#ifdef WIN32
/ B ^, i( o9 `5 _+ H, y$ w& H; G, y" B" p
BOOL use_def_char;
, E6 H; _3 Z" L7 _ use_def_char = FALSE;3 Z1 y6 u- l1 }& |! n
return ::WideCharToMultiByte(CP_UTF8,0,in,in_len/sizeof(wchar_t),out,out_max,NULL,NULL);
9 v% a D9 j" O! ?. a#else
: U; ?- M" k# M: |2 r7 R size_t result;* [* _" l; [) f9 b; ]
iconv_t env;
# u/ X; [' x. m9 H4 J/ |2 T+ M0 c7 w+ H- g- D) d- b7 A
env = iconv_open("UTF8","WCHAR_T");. N/ M8 f( E* K# J0 [/ P+ A
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max); - P+ a b L j; F4 L' m
iconv_close(env);( E P7 M! _8 `4 m0 n q
return (int) result;3 Y' m: i. Y& o" Y) P
#endif7 _; z' m7 }+ O; {
}; w" j7 F. @, v6 r% a3 o7 c& |
' K: e( h/ ~9 h! W3 @7 cint UTF8Conv::wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out)
+ `1 v8 X; H/ T. \" |/ y0 x& m9 l{
! R; U. _; O8 q; j$ j" H int len = in.length() + 1;
# G5 w/ G; y) e' J/ S) g2 E& F4 ? int result;
. I; A9 g8 x+ U char* pBuffer = new char[len*3];( V) a& O0 [2 k/ F% g
memset(pBuffer,0,len*3); * e5 j/ L, Y- b+ b0 C
result = wchar2utf8(in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);
* V" Y; j M2 }, c0 g) x% k2 S if(result >= 0)
7 ~' f. _, X& o9 z- T {; @9 r$ g' z% l( `, I
out = pBuffer;
. y4 _+ m3 x' p! j& c, j }
# y4 S$ Q% }5 ? ^ else* G& D( _+ T) M$ q7 V, c
{' o. X) p* S) z4 A( }/ b- K! V
out = "";& y* ]1 q& y+ Q* d w" X8 w
}
" N; g2 [* C4 |! L# T# @: \& _& O delete[] pBuffer;
6 a) P7 m. \ l return result;
1 w- X& d1 Q2 X4 g: E}
9 ^4 K, q7 U% i2 L4 D% c: a! Y
& ^9 s" @9 {1 T! t& k1 y7 oint UTF8Conv::utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)
8 p& z7 B! a, Y" G{
0 ]) {- [- L( D' ^: N: d#ifdef WIN32
9 w% l8 _' H6 C0 r1 { return ::MultiByteToWideChar(CP_UTF8,0,in,in_len,out,out_max); P" q8 j/ f! a/ `+ c6 x5 K
#else
% ~$ \2 L6 x$ z0 T/ x# h- j size_t result;% u2 L- l; r. g. W$ H9 t4 p
iconv_t env;
9 E5 V5 A T# Y1 M& ?/ @' ] env = iconv_open("WCHAR_T","UTF8");) M% l( h g' N* ^
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);: S. q" l o! `/ x% D* B f! \
iconv_close(env);6 [2 Q! y) X- D) h# u+ R4 a3 V
return (int) result;" s i' {0 H7 R" d
#endif1 x; G8 q7 i. ^
}4 }# ~1 n8 @9 d
; L0 v* N% t/ _; C5 E# A5 b, f' ~
int UTF8Conv::utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out)% x3 V2 w/ x! _- ?# C2 L; Q$ @: W. B
{
' i" y4 P, A; ~ U! d% e* l+ q int len = in.length() + 1;4 W% x; ]! {' E8 x
int result;
. F8 Z- i. X# ]- C, A //wstring temp;
8 C* I/ l) C* T1 i* N1 D3 @ wchar_t* pBuffer = new wchar_t[len];8 ]/ |: e# y8 t* @) f9 n+ F
memset(pBuffer,0,len*sizeof(wchar_t));
3 H, q9 f: i3 [7 t3 K2 r+ T9 P% t result = utf82wchar(in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));0 p7 t( U! l% {- W" `
//printf("utf82wchar result is %d,errno is %s\n",result,strerror(errno));; B9 F- _$ q" h
if(result >= 0)6 ]- G- {6 K3 y* `! t- Z) h4 ?
{
1 G7 F+ M* x, L9 m out = pBuffer;
& }7 C% b; H' a4 ? }
8 G' L2 _* p$ H; \/ @ else5 W; g3 }- j$ I+ f, A7 O
{
. T9 t# y6 m0 g# Q out.clear(); % [1 S# P* D+ s, V6 H/ P
}
& g9 U2 s, Y0 X- @ delete[] pBuffer;& J! S, S$ i) a2 ]$ a: y
return result;- y8 E; R6 W# f8 P
}* G+ \' \- C H
/ ^" j0 t( }) d& `1 I _& N+ X/**8 t: i0 i5 A9 d9 C9 l
*@file
; M- w% H9 Q' ~9 D' M( L! m* {*@author Jimmy
# T9 j" @$ _( ?! ?*@date 2007.1.168 q- j. t2 i+ Q
*/
' ^) x2 Z! E( Y ~' f4 J+ Z6 k6 H8 n#ifndef _UTF8CONV_H_
& \# `) {: D# c& r; k#define _UTF8CONV_H_
2 J2 g; r3 j$ }$ n) Q) Q* g3 O# | i, [
5 i6 f6 f9 j+ X3 k, |. J
#ifdef WIN32
/ b+ _4 `7 W- Z; U0 D9 e z#include <windows.h>
% U- G/ C* C( t) z#include <winnls.h>
, Z) n" A2 M; D3 W2 T! _4 [- S#else! R. {3 m+ B% ~
#include <stdio.h>3 T/ E$ C8 l7 v
#include <iconv.h>0 Z1 W7 ]. y% x# d6 {5 M
#endif7 K% F# x/ `5 o( ~5 J
, m1 {9 X& S- S d5 k9 T" F#include<string>
( Z! o; b( B( f+ s; K3 j
2 S4 R) D' w) a- [6 L) ~
, S5 m, T$ l2 R' Yclass UTF8Conv
7 N) L; a* z, S, i {! M" Z7 E' u3 w% }3 G `
public:9 W( s2 c; {: z# O+ r' C6 d' c
static int codepage(const char* code_page);: ^8 u& J' c4 L$ ?" i
) }' p3 z/ k+ A+ @+ \ b* u static int dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max) ;" A3 ]( g! ]! O" v2 j8 r( n( a) ]
; g3 M' {, T' v9 V6 Z# \( j* ~9 S static int dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out);7 u8 C6 u& H) }" n. f2 ?# o2 `" y
+ V- a; _! C. c/ x) }& X2 Q
static int wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max) ;2 K/ \) I; t6 k( m
* A1 H x0 _" h6 F/ |% C% }
static int wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out) ;7 J3 v. g) i) Y' i$ P
/ ^4 d: b- S" U$ U" ]. w$ o
static int wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max);1 _8 L' t! | I
* ^' O' c$ r- p* p* u( z
static int wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out); w: I- ?: Y' E% E$ t
. F: ?0 J9 G& y static int utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max);4 }5 x. |/ q1 `. p7 r
@( j& ?! {. \1 v: `1 Q
static int utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out);# t7 V$ H" O) k4 ]
};
1 _! I+ Y% C9 }" o% K+ M2 F9 W$ T6 O5 w! t B2 I
9 U/ S; _. H. t/ U5 w9 X
5 E' A1 @8 s( M2 G
* x# {$ l# q% h3 S; L7 M
5 W" [8 Q3 N2 t
, G; i, V# D' _& g& ]5 R8 J8 E, r3 q% ^8 Q
3 t/ ?( @ z7 x
7 t& X" H+ X) L
. ]4 d5 } N3 i+ w n4 Y6 J6 _- r$ s: a
2 u8 P+ i; N6 B4 x" i* W2 H- e( p- N& M8 b; N, K6 g- n ~
. G4 J- @& h5 m5 ~0 F0 L; a6 e4 G+ N. K
+ H6 i9 q$ @0 f" P
2 A& z4 l5 b$ q$ G% f
+ ^7 R7 }3 X6 |& _
' u0 Q1 A" ^+ c
U1 W% {& T" A- o1 s p& r1 Y) Y* v+ ~; X9 F! s# P! C
0 j! C- \! |( A G( V
, Q/ r9 G4 P1 ?6 W6 G
5 D6 O4 m9 ^# H. e' U! S5 l* z; z, ~; r+ {1 h5 u
! h9 k [% t8 F% Z# T+ K
; {! p3 d& ^+ M" U% W
" J6 ?4 s, M, c: O# v# |8 l
" ?" w" y* g2 T* P& G* ^
#endif |