[报道]重新报个到,申请个新人成长礼包~" [, J* A5 A" v y
" r. }. L) L& Z l灌个水吧...
8 ]' R8 K- |9 O2 E- J$ v9 r/**7 }& t }5 u* j) B' c; c @
*@file - o+ i3 F! F2 C- `8 U) i( A9 I2 k8 Z
*@author Jimmy7 O7 S0 A; [% R% O1 Y
*@date 2007.1.16
5 J' P/ ]- i4 b*/4 h% Q/ s* r2 d& b, P1 ~3 {! g
#include "utf8conv.h"
. e: J- {6 ^+ }1 g* A; f
% J4 G/ f3 Y. b7 ]5 f2 P$ [# p; W9 a- F) \" S
8 l; P. U% ^# F0 h
int UTF8Conv::codepage(const char* code_page), R3 G- }/ j4 |: y6 ?+ f
{
. N" m1 q8 r2 n4 a/ U#ifdef WIN32; I5 O$ i( e j
if(code_page)# a( ^! A% f" i3 N/ n& @
{
% E1 X7 ?$ M: b' M8 T7 P. J return GetACP();//既竚箇砞: F! ~ B# ~, R! Z7 o
}
8 q7 U7 O% s3 C, u3 Z#endif
0 p1 m( ~- q/ I( N$ ?; X; e% n return 950 ;//taiwan acp* s) P D, Y" @# ]- R' X7 E* w% r
}" H7 d' Z. h* U2 Z9 k
2 Y; n2 k- f& d1 Q& z" E" P; z) A# \+ H5 E
int UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)
) V( A) B, y# A{
+ I) k$ p' Y5 B1 A! j#ifdef WIN32
* t% z6 I1 u' d/ l+ r. @ return ::MultiByteToWideChar(codepage(code_page),0,in,in_len,out,out_max);
+ H4 ^9 w3 W; a$ g#else ' V0 U+ S8 Q3 i5 x. ?% p4 G4 F
size_t result;: k, \0 d q8 w7 H* m3 J
iconv_t env;+ c" u0 J- l$ _6 T2 y# D
env = iconv_open("WCHAR_T",code_page);
" q; ?& T# P8 Z9 a$ q. i9 C' O result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);2 k" O4 R6 {+ T. _
iconv_close(env);+ o' j1 M4 J! ^$ p$ g+ K3 G2 N" _
return (int) result;
# ^' g( U5 |$ H. z$ o% a; t. j; w6 R! u
#endif 6 D2 }% q0 F$ t5 P7 @
}% i5 T) r$ y k# \# A6 l2 l; d
7 o% C* |% a& C5 v2 J, [3 U* d1 F
int UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out)0 b2 [, c. D9 H q$ @+ [# f0 X3 H
{
3 M3 | e- X9 o7 Y9 P, H int len = in.length() + 1;' S$ Z: D# A6 Z& L" K
int result;3 y; w: m' W0 c* j/ Z3 j& [
wchar_t* pBuffer = new wchar_t[len];
6 D) q' c- b( j5 A+ H7 K. F memset(pBuffer,0,len*sizeof(wchar_t));
) F; a8 ~" H2 ~5 E result = dbcs2wchar(code_page,in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));* m9 T& F$ y. p' V
if(pBuffer >= 0)
' U3 {) ^- }8 V0 C7 U6 Q: h7 f) O$ J9 [ {6 w4 m* s- |" |: \4 f/ E4 \7 Y5 X, x
out = pBuffer;
6 y4 ~ l0 b& T1 {) a# N }" @7 I0 H% A% ^/ A4 _5 Y0 z
else/ }! [/ s. @' s' S& p, Q# T
{, p5 j5 \# ~3 l, H3 g' O" l! V
out.clear();
1 r0 ^& s7 y, ?- P$ O6 X' V }: G+ d* c8 G' |
delete[] pBuffer;
( t0 R. d+ m4 K! `1 l return result;5 p& j/ U- R- C9 ^, V6 s
}0 u5 c8 p6 E [& S2 u u/ L# e
O5 c, o( u. v5 m
int UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)
( G$ X' |2 {, P{
& _! p6 f% Z/ i5 B#ifdef WIN32' f# L3 K4 t. T! S1 ?: D! T3 E5 C
BOOL use_def_char;
/ }4 r9 s9 |4 G6 H use_def_char = FALSE;0 C6 C5 `+ s' P9 ~2 s1 B4 q' @
return ::WideCharToMultiByte(codepage(code_page),0,in,in_len/sizeof(wchar_t),out,out_max,"?",&use_def_char);, |! t T& J d: P: r, h
#else
% b4 U* N' a4 c5 [5 b- z size_t result;4 W, ^) W2 S1 B
iconv_t env;/ D2 T" G" L" y5 T
env = iconv_open(code_page,"WCHAR_T");
1 g( [3 D6 r Z3 [ result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);; ^, b- U7 j# U2 w+ i' O( f
iconv_close(env);& f7 o v. d* B- u0 H6 a8 n
return (int) result;0 z( Z/ X* R) D" D) E7 z0 N4 J
#endif $ Z2 Z( @+ X0 v" ~3 q3 s) Z
}
, E6 y3 _, z$ ^1 \: ^) P u2 C' B
L8 p Y" T4 xint UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out)
7 K# M1 a' |; F1 N5 F% [{
# Z2 b9 E) y4 v1 V5 J+ g$ Y- r int len = in.length() + 1;
4 d; S4 O2 u$ |: R6 N6 J int result;
1 U5 B- f U m5 m9 X1 Z char* pBuffer = new char[len*3];
f& _/ ?/ R# p% b0 R+ y memset(pBuffer,0,len*3);# i5 Z' v& y* i, z; {4 a' L4 D
result = wchar2dbcs(code_page,in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);, \' N- i) \: g& p) Q
if(result >= 0)
7 z) |: V9 P$ h! z* b: d2 U {
2 U, |4 O5 _6 F: H out = pBuffer;% z) Y. k( }* e. ~* t1 I
}
) h0 k' R: p8 \$ I/ ?3 w. Q. e else1 _) e+ s+ o6 a
{
: J6 J' n* L# E3 u out = "";; B. ^0 ], @* A7 ]
}
5 g/ |6 u6 [" O5 R delete[] pBuffer; O! }! B! ^) m
return result;# l* g9 o+ ^6 f$ Z2 c6 h' u
}, @0 M0 w) w! W9 [2 v1 T. L
! a* k v( U( |
int UTF8Conv::wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)
& r* C6 N4 o0 R. M: e9 q* G{
4 ^( J; j8 }9 C4 K#ifdef WIN32
, a3 y& g6 w, B+ [( X* L% s( s8 ~. C2 ?/ @7 w' I+ Q* }1 g
BOOL use_def_char;4 M: X8 E9 c/ d
use_def_char = FALSE;
% ~; E; ~1 P, t' \' L! \ return ::WideCharToMultiByte(CP_UTF8,0,in,in_len/sizeof(wchar_t),out,out_max,NULL,NULL);5 V- C; `' w' T. M5 |
#else. ^# n. X2 G/ x X% }( @) r
size_t result;
6 ^; P8 l# I B& R( Z iconv_t env;
4 x* i3 P, X1 S2 O$ @0 [ H- X( p+ ]# r
env = iconv_open("UTF8","WCHAR_T");
) x9 c5 r2 n1 ~" H% |; ?6 g" T I result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max); 2 p" V, D0 d5 p' A
iconv_close(env);
; f; P v; Z; `1 t& n return (int) result;& U2 f8 Z* c; A! R7 d
#endif
1 ~; ~0 b/ }+ ^$ ^. R0 Y}
) g: m$ o. J4 z! [+ L4 a7 l: @& L$ B8 B7 O/ F) f
int UTF8Conv::wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out)
1 D5 { p1 n& v; z: G+ H{
7 B9 l4 l1 C0 W1 B4 j& ` int len = in.length() + 1;
' F2 T6 k$ j o int result;: b( a- h) P. N9 k% L, `: Z
char* pBuffer = new char[len*3];5 B" n+ z1 o" O9 P
memset(pBuffer,0,len*3); " p# G; w$ k0 g0 U( Y
result = wchar2utf8(in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);
, P! n |4 `% `" w9 [ @0 U& ^ if(result >= 0)
- B+ t1 Z& N$ n0 P- i; g {3 B8 P) U( |7 s ~( b. q/ t
out = pBuffer;
* m, I! i" `9 l }
5 G2 t* s! O( N& V; H( D else
( B: }5 i$ @* ?0 X {. L6 [7 e% j- l6 E- b8 @! i
out = "";
/ X8 L. Z6 Z5 A) T! y }7 C) F" W8 `: G \$ p X8 A
delete[] pBuffer;9 g+ }$ k* o# [ z( O$ L
return result;
9 u# ]2 I3 f {! ~. X1 M}
% J8 D; ^- D3 x
$ F( `6 Z( c* q- C* s' ] b! Tint UTF8Conv::utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)
7 u# d1 `# K1 ^. P{
3 J& `/ R, i! G1 b& @. Y @$ y#ifdef WIN32
8 G3 R6 |2 @' l3 d return ::MultiByteToWideChar(CP_UTF8,0,in,in_len,out,out_max);
0 t9 L" _7 Q% w- T#else0 m! A: p7 t0 ?8 n
size_t result;. u" R: G! C" O! c9 S
iconv_t env;
* Z' W* [: T" P4 X. L, ` env = iconv_open("WCHAR_T","UTF8");
. \1 d9 O) f ^0 I5 S" b8 X' Z result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);* Q2 X4 Z4 ~" `
iconv_close(env);! B. B% ?( Q8 ^/ q$ E# F
return (int) result;4 E2 a# U+ E. f9 V/ t+ i* P
#endif( E# i* I7 h$ ?/ `9 ^# _
}' ] k: S' C3 C+ y! q }
; l2 H0 K( ^9 W% |
int UTF8Conv::utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out)
) n* ^( M% X; P% `{
7 }& x, x, o6 t int len = in.length() + 1;
5 z; ?$ c _& Y int result;
& v- M. v, g5 T# \" P //wstring temp;
% p7 w* L7 P- n+ \6 A) q wchar_t* pBuffer = new wchar_t[len];; U4 W- s1 I7 j
memset(pBuffer,0,len*sizeof(wchar_t));6 ]0 @8 _, r r' f
result = utf82wchar(in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));3 @5 z1 k7 G- \3 k$ B1 R
//printf("utf82wchar result is %d,errno is %s\n",result,strerror(errno));6 q: X% G( y$ [
if(result >= 0)+ r3 E; Q+ `% P$ b; {
{* ~: m0 t; c! }5 G/ R1 y4 O- L
out = pBuffer;
2 ^! g f" I- M, [) t( V }5 {+ K4 G1 T& q& D8 s
else, `+ z0 w) `2 w5 P
{
) e% }9 X7 R0 [/ w |* k9 m2 Q out.clear();
9 K5 k4 U1 d/ F- b }
8 ~0 [, L3 `, M1 ` delete[] pBuffer;
* v* G; k' [ N return result;
4 {8 `+ w' a- [}8 G+ D" [. I& G. _: l G' N, J& B1 k
# \7 }( d- \5 @& n4 z: G/**, X5 e ^% i) `3 |( _+ |' L/ t) Q, a
*@file
1 K" v0 V9 L$ t, d' P5 Q" j*@author Jimmy
$ l( l2 h; z; A3 f*@date 2007.1.16
9 W) B/ p" T0 l5 J$ W, a/ v*/! q4 `9 t5 E! _7 k3 @1 F
#ifndef _UTF8CONV_H_8 s& _- q) I' t
#define _UTF8CONV_H_
7 k1 {( `4 U g q* o9 K# I/ N2 |' D3 O, ?, E m6 r
t' P( }2 B8 G5 P+ g
#ifdef WIN32
) K2 j3 l C( z9 @3 B, G! P% ?#include <windows.h>9 o+ X! h+ m/ c6 G! V4 W9 n
#include <winnls.h>
/ a( I5 s$ t' A; g#else" m/ X' z$ Q7 ?. e& \' ]# W
#include <stdio.h>& }6 W" c+ |0 _: X% Q6 L- Z
#include <iconv.h>
& b( ~- ?- M$ Q1 j" A#endif
2 P" `+ G3 B. l0 C3 d4 x( \6 j9 S
% }* L2 ~8 b3 c0 v; A) @#include<string>& f# c( U6 G+ i
9 d- |) R: ~- ~3 X0 t5 P
0 }; v2 M$ D) }6 O: s5 eclass UTF8Conv( _! K* B) I6 L. a' C' U; K
{
8 i; Z4 s/ U2 ^1 J& p; e% T V9 `# t public:
& o! k# u& \0 G; s& i- c/ U& a static int codepage(const char* code_page);
" ~( \& o, @2 k! w$ ?/ I1 g- M" H, G. q1 s$ [/ {
static int dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max) ;, I" y5 @; c& }; f
3 N3 j3 p. J; N9 \" v
static int dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out);3 k1 X2 u% ], _( x w* e3 i
4 `- k) n/ N6 E8 K static int wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max) ;
7 D0 m; @$ s" e+ C# h7 Q3 T a! h1 ~
static int wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out) ;4 Z. O& g) t- d3 v" ]! g$ A! B8 C9 C
) M# Q$ i0 A3 N7 u7 t0 P
static int wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max);$ d+ W$ i+ K5 } ~2 W
. I- f# g& h, Q. w( P. V
static int wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out);& @ F8 X" A$ d. F( W5 e
3 D2 y, v& z" G3 m1 I static int utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max);- m% G, D* q! \6 Z/ m3 D
4 M% l. T, |( c! L" S
static int utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out);
) a" \1 I0 a& i" x1 d- R& t};2 a" [" o4 T0 d% z/ i6 o
& B9 v/ d3 |, P* E
3 H7 _+ N" @4 V" C$ g6 F9 e6 _
2 a/ c% n3 q% f3 ~1 a7 O+ W7 B3 V+ [$ c! ^' ^5 G2 E
! C+ Z% Y6 L$ p2 _# u
, b$ ?( ~. D6 q% K& q
- w9 P5 `) M6 Y( t* Q
, j. X& T) c* q% j8 p) |0 u0 n
: ]4 R/ b" O; X1 w+ ?8 |- c, [& r
' y, G, t6 W0 n0 G9 w
" \4 c) ~- Q" x& \( V+ e
' _. Z% y6 j7 a$ g! F3 ?
1 ]$ A* Z! t* v! `/ u: {8 _+ s
5 e1 @! f" J! p0 @2 U1 U
( K" f8 S6 r/ h. x' k
- {9 m" q D: q3 N; f2 V# w4 j0 g! |4 i8 l7 a# w1 k
# k2 {' X) G* w" W# ]
3 S/ L: F/ }' l; D; V1 T; [0 q) b8 U9 E# B) F
/ r; g. V) @/ X" g) i5 ]. H+ q4 g
/ Y4 B% c% M `1 u3 E5 j7 R; A. y) m5 p. S: m
& S# x' h- r8 B* F
/ H8 s2 e9 s! z' w" V6 A/ w% ]
) |: R- o& f" {& U8 v7 \" U
0 |% A& l5 ]$ d8 k* @
2 S* D/ H7 V( O9 S2 n2 W6 {' `; U" Q5 g+ _6 g
#endif |