[报道]重新报个到,申请个新人成长礼包~
# ?( `7 b6 ^3 h. G3 e8 l/ B* i; _6 E3 [# m+ ]" r ~* E
灌个水吧... W' n- j" x7 ]% [
/**) o1 K. N6 S& P3 y& t) X3 h0 N1 g! _
*@file
. N' s8 q3 s9 s1 W1 k9 j*@author Jimmy( a( V% D% ]" u, y
*@date 2007.1.16- ~/ U/ u4 r( C+ J8 q
*/3 F) {! B; z7 q+ a9 W! k
#include "utf8conv.h"
* F1 S6 B* _. ?* J5 D
\) D6 ~1 E! e1 _+ P& A0 S" D+ a7 A' R+ z
( O6 Z2 C& F1 w: C& K) Z* fint UTF8Conv::codepage(const char* code_page)) K. D5 ]& A( V# {$ j
{
& H; C8 x" @) k8 e% o6 P#ifdef WIN32
e( \- ?1 L) ~( j0 t( Z if(code_page)
/ x1 l4 i+ W' D9 g# B- a5 c- ? { ( ?4 y( _' P5 B, q" m+ d1 F0 [
return GetACP();//既竚箇砞) j( O8 p; a' k' P
}
7 E# A9 G$ e; H#endif$ Z7 L* u% Q! y, N: b1 V( f
return 950 ;//taiwan acp
* ~2 c* x2 }- }7 q5 e3 x}4 D8 L& z$ h) m1 p
0 q* b3 H, f0 u3 _
7 @# J9 Z) s0 {/ |/ }# t T; Eint UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)( H; ` A4 M( R7 Z) y3 \
{6 a: s, o7 C1 P: m5 ]! A; [! m1 g
#ifdef WIN32) |5 o: }' `3 w! P! n3 ?
return ::MultiByteToWideChar(codepage(code_page),0,in,in_len,out,out_max); u# e* I! p6 ]) ^1 t8 v; B
#else ' t8 p0 [0 E, a1 j! g# l
size_t result;3 J! F' c$ B5 \0 z7 N* `
iconv_t env;
4 ? Y9 o, }- j& T( L, c8 \! O, j env = iconv_open("WCHAR_T",code_page);% z. m5 p/ U, v
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);
6 t7 {/ ~" ^1 o! @" e5 g iconv_close(env);. X! c$ j" T' p6 Z. W D
return (int) result;
% s* ~, s4 n: V* ~2 P. H4 j5 v6 T6 u6 |
#endif 7 ]( x7 ?# J, s w$ f
}
2 ^8 o- G1 p* ~& k' `6 Q8 b; o* E6 ?
int UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out); u; P) l- ]! d" P/ g7 |: j+ |
{; T$ h- H3 @' y) `& O3 I, J/ u
int len = in.length() + 1;
9 U3 Q$ ^4 W5 S# r" V int result;
* [" t. N! b( H wchar_t* pBuffer = new wchar_t[len];
6 k5 G2 p# l- ? memset(pBuffer,0,len*sizeof(wchar_t));
/ [5 V+ t* U* k! Z* s result = dbcs2wchar(code_page,in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));1 ~4 F! M8 a/ J f; i7 Z/ {
if(pBuffer >= 0)3 Z" x W& Q0 E4 @3 i9 l0 ]
{! q4 M' V. m# R4 a
out = pBuffer;" i- C$ i& S1 Q8 N) W
}
0 l% c% L5 x t# `% ?1 I else
) L+ E; V0 X& R) }5 \( D {
: U& L% b/ x# V. j% V/ h out.clear();, J! \6 b# K2 S& X; a9 t, L& I
}3 \5 u6 q# [9 l# I, B
delete[] pBuffer;
4 ]$ x5 A3 z6 I f return result;' p( ]+ ^. v- s
}+ A6 q, d$ x; e! j% P4 r& v
( p# c. l% M" y! F1 |2 S, ^int UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)0 j y) p! z! ~/ E, A6 o. t
{& I( H' J" [0 J9 U; \" e9 ^; E
#ifdef WIN32
2 v" o+ S7 b: \1 y/ t0 m BOOL use_def_char;" D K! ~, |3 D6 E0 B
use_def_char = FALSE;
5 i* O6 @$ u) s return ::WideCharToMultiByte(codepage(code_page),0,in,in_len/sizeof(wchar_t),out,out_max,"?",&use_def_char);
* ]6 N H8 M: Y$ b, o% w#else, b+ |+ P1 @! [0 {9 M
size_t result;5 a* |0 w/ I$ n3 u' a
iconv_t env;" N2 [$ F4 `2 p1 G5 b
env = iconv_open(code_page,"WCHAR_T");
0 w3 U0 S4 o; E! @. J1 P5 v8 ] result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);+ _* ^8 l4 @1 |' V2 O& R; T
iconv_close(env);- {9 j0 q6 `5 Q& r! Z
return (int) result;
8 m) Z. T) R* A1 i5 h#endif : D; A6 E" q! G a
}
( Z6 T" `7 J- L- H! E7 d) D' P6 A5 A# e; @" G5 v% g: p5 v* c/ {
int UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out)
3 D. i! l" w1 j! m$ O{# W7 \4 C5 d# U( Y
int len = in.length() + 1;" _/ P& F+ i) q6 K4 A2 U
int result;8 I+ L; a0 n; T
char* pBuffer = new char[len*3];
: m! K* h+ B( b: W, J memset(pBuffer,0,len*3);2 H) E, i6 ?' ^$ d) l) Y
result = wchar2dbcs(code_page,in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);" c' K F9 r! C4 |
if(result >= 0)( P+ i' J2 ~9 B( H) u+ e. _
{
, e& D' d( S) _. c out = pBuffer;1 f. X* x' ^* _! X" G ?0 ~
}6 z, e; q+ j7 [! Q$ z
else! c/ z, b0 K- P6 i. W4 }; d4 k
{
2 ^0 \5 D; ^, u0 r$ s out = "";
6 H+ D1 i8 [. y }. _3 o4 h( U3 p2 |8 h; o/ D0 n
delete[] pBuffer;
4 u! s' i9 t5 g* M& L+ } return result;
( z* `, H" p- E& ^; ^0 G3 {}
3 ]8 E- [* D: Y
/ i% |5 d( N' E& y0 V: v! \7 \int UTF8Conv::wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)
* Z! z7 D q8 A- \2 S{
5 Y: @: b+ [# P) [8 v#ifdef WIN323 d' U1 {+ K6 R, P( m0 Y4 B$ G
: y1 s6 W9 z w# `* l: ~& g \7 q, N
BOOL use_def_char;( r' A, p1 b( b. n
use_def_char = FALSE;5 e3 r" Y( X- {' Z3 A
return ::WideCharToMultiByte(CP_UTF8,0,in,in_len/sizeof(wchar_t),out,out_max,NULL,NULL);
# [$ g# K0 V( h A! S2 x#else
; l7 q/ k9 |: ^5 F size_t result;$ e' M3 w) ^, b( ~3 H
iconv_t env;
5 L {/ l Q: ]/ M) D# \& [0 Q7 B% j; ]2 F3 }$ w+ L
env = iconv_open("UTF8","WCHAR_T");8 B' Y* ~1 h7 Z1 A0 B- n$ X
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);
. x7 A1 r9 |( i ^ iconv_close(env);1 m( R# f3 d7 r
return (int) result;3 O& }' y7 f( j1 F6 K
#endif
/ E$ I, I r2 J5 w0 ~. y- i}
3 J) [/ y* H" G7 v' r
4 r7 S8 u) V. d8 B! U+ R0 s7 g8 Xint UTF8Conv::wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out)$ E4 x, |7 F7 w
{
6 t }4 h& r, Q S* W int len = in.length() + 1;- d% j7 ^* n; H' ~" K
int result;
: Q- I T8 a) r' n8 J' Q; U char* pBuffer = new char[len*3];* N" s4 d+ v5 S- {% a5 ^0 ?, k( f
memset(pBuffer,0,len*3); 2 C6 |/ \3 v- r: B' Q( w4 ?9 j
result = wchar2utf8(in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);
2 |, P* @5 m9 H: z2 \ D if(result >= 0)
, X" z" I: e5 v {2 ~" I1 J( `2 U5 z1 X8 r
out = pBuffer;3 g$ n7 s' N" _, N4 W. E
} z7 b( V0 a& K0 \: I
else6 e) [2 ~' ?4 P! D
{) m0 @8 M- z6 {* K' T
out = "";
# v7 v' {8 u: e; g9 r5 W }/ g) W& h; v0 L9 n! e) ^4 m
delete[] pBuffer;1 ?% J- U) U! b7 u
return result;6 h2 K% A6 Z. @ d
}
& Z- K( h( u2 J$ ~3 @, ~- e/ g
* y! a4 O$ `7 ~. w, I cint UTF8Conv::utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)
1 |7 a/ f, |2 R# |* n3 w{' E) s1 q/ L" b/ W( p$ [7 G
#ifdef WIN327 A7 S3 Z o( ^1 `' o: ~" z/ N
return ::MultiByteToWideChar(CP_UTF8,0,in,in_len,out,out_max);
8 k, ~5 R0 \ F5 \1 i3 }0 X' M#else
$ ~5 D' `" g7 J size_t result;3 K1 Z1 }% |& Z' g
iconv_t env;3 ^$ U3 ^4 A$ N j1 Q
env = iconv_open("WCHAR_T","UTF8");% a: i" m. ^4 _8 u& I6 ], F2 ]7 A
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);
9 N2 t% a; j0 J( z iconv_close(env);
- B/ R" n( n6 @6 @: s: ^& | return (int) result;7 a4 D) e8 W9 q G5 F6 D% H
#endif% V9 V! B- K9 [0 e
}# [& W# M b: Z2 G+ C0 Y+ I
% t6 V' a* `$ ?. V3 `; I
int UTF8Conv::utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out)0 f" \) X+ ^8 D8 q" z( v5 c: J
{
5 y- c( c9 h, L* h; P* k( b int len = in.length() + 1;
( p) G2 N& a6 ~ int result;
. l( T% u- C; Y1 E4 @+ }, U //wstring temp;
5 H' ?# b$ h: K wchar_t* pBuffer = new wchar_t[len];/ i# d( {7 z! [7 C' ?
memset(pBuffer,0,len*sizeof(wchar_t));: w! z6 e) r. z x6 F
result = utf82wchar(in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));9 {0 C% i, h+ @* h
//printf("utf82wchar result is %d,errno is %s\n",result,strerror(errno));- ^/ T- Q: ?3 ]4 J; G* E) ~
if(result >= 0)+ ~; z! r* q' x: m9 M/ t
{$ n: y' a# q* v: X3 Y
out = pBuffer;$ H `: f, H" y& ?
}
2 b) e3 J7 P. X& Q {5 s2 s else; l4 F h# M* F1 p
{/ m: T. U( z' K' C/ e
out.clear(); & B; T0 j3 q" j8 w5 \! D* E
}
( @1 H# p( u" K# Z" n delete[] pBuffer;
; [" B5 J2 |6 m4 k$ h; ?1 D5 e$ r x return result;, z w; ^0 q. b' U+ J
}
1 p& i$ e% \( _% L$ }: R5 V6 ^ h2 f. P3 L% A6 T# ^. v
/**
4 O5 ^. i' q4 j*@file
9 |0 m: y, J1 U# ]* Z*@author Jimmy
& v/ v1 d2 G: t- {3 f3 t+ V*@date 2007.1.16
, i/ n0 f o8 f" V% Z' z+ Q*/
+ s7 h1 X+ C7 _& W$ M4 |7 t#ifndef _UTF8CONV_H_
! G. B. j) y9 D& Z8 n#define _UTF8CONV_H_
! ?5 n8 L; H( m& d4 g; U
0 N. Y w5 g! V( f4 v! z* O; k1 w c" I9 T6 h1 u5 h2 K. B/ \
#ifdef WIN32' G/ I( F. [" F8 z7 |6 W- Z) e
#include <windows.h>
! Q) j/ N7 n6 L# Q$ s$ C#include <winnls.h>
- U0 {) s! B' E/ C, a#else: a( N% ~# _5 o. ]" Z, h( _
#include <stdio.h>
$ h6 O- d9 r6 G/ O6 O" v7 x#include <iconv.h># A" C% i; q: A8 R- j
#endif
* }0 k$ m9 S; }. O" D# k6 l% o5 Z$ H7 ^0 f' o0 h( V$ m2 f
#include<string>5 [+ t; T) g, E( T) S" L6 j& Q3 M
1 n1 A" N9 _2 q: h S& B9 v6 E3 N- i4 @4 \; R0 S
class UTF8Conv; n# w4 y- @4 u- i- g7 N
{( p0 _' i# c8 ^3 {7 b
public:4 n' a: \8 ?! j" m% y' s
static int codepage(const char* code_page);, B8 X! |% l* L$ B2 b$ R b
5 r! M3 R# E2 N) w4 u7 A7 S8 g9 r
static int dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max) ;/ ?6 w5 H2 ^+ B3 H; \( l' ?5 l: A
( Q5 M9 C, P/ u! B& T: X8 T
static int dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out);3 j" j8 @8 l# p# F# i( u. [
. N% S+ g* f) v9 w; u: T static int wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max) ;
/ S6 n( F, a3 l! K9 o; K' P0 @
+ q2 M) Z) G9 w6 T static int wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out) ;. d; F$ B$ Z! `# c7 N% f% Q" Z
" K ^) j. P7 l5 N c' [ static int wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max);/ A* t K7 ^0 j& ^3 q6 h c1 q
* d# e# h. c/ ~. Q static int wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out);& v" J; H1 E; K6 p
I, D4 F0 s! \ static int utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max);
6 A; m2 ?/ N- l+ u/ o. {% |7 R. c+ a5 T! ]; T9 D7 p
static int utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out);3 O3 T+ J7 _6 R# Q
};
0 v! `% d1 ?6 q0 y/ ]8 f1 r8 R8 m3 ^! _& _- F/ w. Y6 }" B2 n$ d8 Y
- c f$ J% ^; r) o6 S' k( m$ k6 {
b+ O0 V- j7 f/ Z7 ?/ r
% w: l/ B5 R: { Y7 h
9 l4 C# O2 Z( f/ l6 s' L
0 h# x7 A u+ f4 V. } p
& e! l' |( \5 d+ M; y( v' w' X( f& p2 e- \& t% x
" C0 ?* m ?! J& ^4 P. y0 _% B4 y( G0 I3 x; y* _
: y: D7 H, U& |
3 a: I0 X& ]) Z/ E% Q0 |
2 R, n" J" P+ [( o7 c' T
. c) S* @% w n. w" \
3 q9 _1 z/ U: f8 Q! w1 x' ?
5 B! t: w2 T& A# b+ }! I4 [3 ` C- ^% x, z' L
+ d4 N; e3 @4 t. Z" k1 e
$ p1 N! r* a; k3 U& e- s
' s. u# z: j8 R
" I. }- X# q- P1 Z. D" D7 Y& ^# N8 t. n. m- p% Y+ i8 c% J! T7 U7 T
% c6 l, l! j5 f' a
1 b/ f/ t. o0 }% ?
4 n. j% K4 Q1 H. x
& @! |1 M, \( X3 {8 d a" G+ b5 K
$ ?; e+ V. F# y; A$ g2 [0 r
- |8 b7 |, k7 M1 ~8 n' G9 i& g
6 p2 Q% }4 d* g7 \3 x#endif |