[报道]重新报个到,申请个新人成长礼包~# c1 O k; `5 ?1 a
& A. p; t) V; {7 R灌个水吧...; w2 A( Y6 N0 Y6 s. K: a/ `1 G
/**6 J* f2 i8 p3 G5 o7 a/ R
*@file
5 `% z5 u$ z; I: ]/ k( X# E# g# \; n*@author Jimmy
$ u0 b, P5 s# I( G* A, H*@date 2007.1.16
& p+ S/ \5 U- W2 T' B9 E*/
: c/ _$ R5 y! E#include "utf8conv.h". K! F% \1 ~) c# S$ i
+ ^9 B# W2 ^: B% w
9 A; L. R- t+ z+ @; A, A
& S( R7 _4 Z. T' K$ uint UTF8Conv::codepage(const char* code_page)1 v7 `7 t+ v- ]
{
' D0 H5 i: y+ e | _#ifdef WIN32
0 v8 R' Y8 q4 M* a* @2 l if(code_page)
2 T& ~- h! K3 U7 f+ g5 h {
+ Y' l! t0 w% B* t% | return GetACP();//既竚箇砞
# Q3 {0 X6 x3 F$ U9 P( X1 D$ u4 E }
' P8 ]! c( U. G* l7 X#endif) B7 k3 G/ x, ^. V g2 s
return 950 ;//taiwan acp
; r# l$ r: B& M6 c}* n m5 n3 r f, j7 A4 Y5 f
8 t+ G( L E; r6 G3 C
4 G/ I( G) c0 Y z O) i' K1 j2 u
int UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)
5 b! |* l7 n% Y# s6 }* ^2 h6 g{) e! Q) w, B4 Z
#ifdef WIN326 e/ K3 v1 x8 ?0 `' g0 b
return ::MultiByteToWideChar(codepage(code_page),0,in,in_len,out,out_max);
% c- p- v" i& e% s, @#else
- H: V5 S6 b" F# V- {- n size_t result;
0 `0 s, R3 d E8 K" @* [% r iconv_t env;; j2 m# m5 b8 c
env = iconv_open("WCHAR_T",code_page);
, b- K( M7 b% j+ N2 O$ _ result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);0 ~9 d& S. I1 v
iconv_close(env);1 W" N/ S: ]; ?* @
return (int) result;
6 O5 D; a% G! D& f3 Q, h& v5 W1 J% c; @
( k' K% g0 v2 t#endif
3 \9 d. F; H5 D8 t$ O ?}- d; u8 l* Y. N3 O' W
: @5 V4 r- }( g# a4 H
int UTF8Conv::dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out)6 c, ]# ^/ s4 w' a
{+ e" p( x0 m1 \
int len = in.length() + 1; x0 o! H, n2 c7 Q& w! O2 r [
int result;% ?) O: I9 @& l7 }/ @2 ~
wchar_t* pBuffer = new wchar_t[len];3 |$ z( \( s2 }' l- S8 U X
memset(pBuffer,0,len*sizeof(wchar_t));
2 w; M) d9 u. O7 K result = dbcs2wchar(code_page,in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));
) G( H" L, L! Z; C) m2 w# s if(pBuffer >= 0); m; v& Q% @5 a; ]! f
{
) {, Y3 h, P/ G' [ out = pBuffer;: o5 {: a/ y+ n
}
. v5 p" m0 o+ X else
7 F0 T: y% x$ B: Q {: D2 }9 M A0 g$ {$ o, [
out.clear();
- t& y- f @- q) l4 A }
* f0 `- @0 L5 ~, a delete[] pBuffer;. W- `( M u5 ?% @# z: A; V. `
return result;
- ?) q, L8 Z8 h+ i}
+ U+ X5 b/ X; j2 J* I1 k, C+ z
5 \8 d) t9 h5 e0 y$ c3 D5 }3 gint UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)
+ L3 @- A. T6 L+ z{
3 \) r. t$ W. u( u: x. m3 G#ifdef WIN32
. v9 Z' I. O9 l4 P6 B/ Y BOOL use_def_char;% E( _* @' a; @% U0 V' }' D
use_def_char = FALSE;
7 J; W7 |4 N' x8 D9 F return ::WideCharToMultiByte(codepage(code_page),0,in,in_len/sizeof(wchar_t),out,out_max,"?",&use_def_char);+ p# l' F. D. Q5 N1 y1 e& m
#else
2 j J2 o" N2 x t2 F size_t result;4 O; y9 d2 ^& l! P! V7 p- O: t
iconv_t env;' `3 x1 r$ e1 h, v7 Q# N
env = iconv_open(code_page,"WCHAR_T");3 g; c$ S( H r+ J8 U9 O7 Q$ O
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);; L& E2 u. v" F: m
iconv_close(env);
& J |3 O* ]8 O return (int) result;
$ K {* l T4 E5 |$ _$ j#endif
; p/ H8 Z3 W. R5 K, \0 _) w}, E! I% W; L' M3 @1 D' U
5 ?: q! y1 _7 Y6 R* Q( yint UTF8Conv::wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out)
9 X' Q; {( p) \{5 ?2 V1 T5 m; ?' I
int len = in.length() + 1;2 _: @1 |9 R' t- I
int result;4 q' X/ L8 }3 o
char* pBuffer = new char[len*3];
% D4 E/ W p& K5 W2 I memset(pBuffer,0,len*3);* T6 `7 ^' a# e& p8 C
result = wchar2dbcs(code_page,in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3);0 w( z! S- D0 c, R& U4 ?, P
if(result >= 0)+ l8 L: J( j* v% c F
{
: ~. O9 g2 Y( X& N! @7 @, I out = pBuffer;
r8 {0 L" b' I: ^3 I3 k4 }% |0 C' e }; ^ i3 J$ o* @2 v
else
) Y3 E& ]" a9 a4 [' ` {+ g2 B/ j0 S; C) X
out = "";( f; t; S; t9 o! P6 r
}
9 F4 I! [& ]5 g# c+ o4 \: V& R* \ delete[] pBuffer;
8 R+ }! Z. V: g0 I+ d return result;
2 _* o- v: Y' }}
b* J0 C+ u$ A
+ d% v: H5 B' p8 _int UTF8Conv::wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max)( K" k5 P% I* X+ v
{
6 i5 ]- }. B, F4 U: w: H6 g#ifdef WIN32
( E/ z' g* V( K, o7 z" ^! A5 ]& n
9 l6 t7 ~- `, U& { BOOL use_def_char;2 @! P, h' }& J
use_def_char = FALSE; R$ c [% B s! f1 C
return ::WideCharToMultiByte(CP_UTF8,0,in,in_len/sizeof(wchar_t),out,out_max,NULL,NULL);$ ^9 G s! T+ k0 F C
#else9 T2 o5 V6 k: Z1 D: ?2 o
size_t result;( q; o i. ^: |1 Q: d% Q
iconv_t env;
/ I% R7 n' ~7 G* i* }1 K$ t9 g8 N& J/ z* }
env = iconv_open("UTF8","WCHAR_T");' z" @' l5 V' K6 l E
result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);
/ m$ v* r- B- j5 c2 Q9 ?+ ^4 Z( ] iconv_close(env);
/ J9 O$ j9 X. f/ V& O' n9 x return (int) result;" P& ]+ n: k4 U: \' j, h& S1 a
#endif
* _2 Z# ^5 p5 B6 D2 r: P}! C }. A8 m) L, u$ ~. a" J/ y
7 Z$ E2 I7 O9 p) |1 v4 Oint UTF8Conv::wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out)
; i- r* ~( {, }1 |& { w4 ?+ W{
2 }6 o* R! p0 `# b5 P4 h int len = in.length() + 1;. f& U/ M; w, O) A1 R; Q0 s; L3 [1 e
int result;' d, ^8 J% B% b7 o* x( d: j8 L
char* pBuffer = new char[len*3];: K; [0 J! w. }( c6 \$ Y
memset(pBuffer,0,len*3); ( D S' p+ O" `% D7 p% Y) X
result = wchar2utf8(in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3); 6 G8 ]* ` w- E! Y
if(result >= 0)
' h, \3 D9 Q9 d/ | {! Z( g5 p8 n$ Z: N. y
out = pBuffer;
- N; G; K* d2 [+ |" b" F }" T( h! M4 u. B0 O, e9 p
else
5 O3 y0 x% x+ G5 Z {& ?* H" t" i+ A" N
out = "";1 y# L5 e3 E/ K# w. O
}
5 m- e4 Q9 M9 q- X$ Y delete[] pBuffer;
6 u! q$ I' D6 O, A- d/ W# z return result;
0 b& M8 H' v% X) h) k. A- N}
5 T8 p- G4 Y" |9 K- y
# k3 k) q. m. I" N; _+ \int UTF8Conv::utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max)) f% I# h) ^8 [6 j/ \
{3 D0 s7 [ {# C' k' _2 z8 {5 I
#ifdef WIN32
4 o6 z2 j* K) S4 b6 f- } return ::MultiByteToWideChar(CP_UTF8,0,in,in_len,out,out_max);/ t% i0 {) K# p- X% D. O1 O' ?+ A
#else
# Z$ g/ i- c8 [ size_t result;+ F: D$ S; p( J
iconv_t env;
# a3 D) j$ k- z& `6 E env = iconv_open("WCHAR_T","UTF8");
f, s6 Z& s7 o G, Q6 \ result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)&out_max);# J% p8 L* J/ V
iconv_close(env);" N5 n8 _( U8 p4 H7 \
return (int) result;0 L9 S; _% x+ H7 ~
#endif( ~) w6 k8 S1 l6 s5 K3 r7 P! O6 g
}
' R8 V) U- f- l* | Y4 t/ Q* A2 y
int UTF8Conv::utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out)
3 P) t/ a* H N8 Y{3 m9 @* H+ @* O- ?
int len = in.length() + 1;$ c- G! \3 S" F7 r$ N+ ^. @( U
int result;3 {2 H9 ~' D+ l# |1 A
//wstring temp;+ q, \# ^2 a i: w
wchar_t* pBuffer = new wchar_t[len];
M3 `1 d3 o/ W) K6 y2 @ memset(pBuffer,0,len*sizeof(wchar_t));2 |0 G+ S1 f. m1 U/ R! e" l
result = utf82wchar(in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));7 u- n6 g7 z: o$ M
//printf("utf82wchar result is %d,errno is %s\n",result,strerror(errno));
7 T2 _5 k( o3 Y3 P. P& t+ I if(result >= 0)8 y4 @5 `* _5 L, O* q1 \
{, \ C4 O: k) v6 I" ?
out = pBuffer;* ?4 T+ F. K) W5 T
}5 W( M2 k. G( K6 E- ^9 |
else
3 a$ F! S) K/ I t) Z8 G% H {
# l! M9 R; {. l out.clear();
6 e/ {8 @# ]( P- E }
( A1 k6 k" e* n% j }2 Y, K delete[] pBuffer;* m9 }6 Q1 Z% N7 r( [
return result;
4 ?5 I/ Z. w, b3 x}8 z+ F- j2 R. A
0 o2 M! J- c/ D" F+ B
/**
# K6 p: _1 y! }: V1 P: x6 S$ A*@file
9 S$ C6 G2 O6 |0 A! m*@author Jimmy3 H# n H0 U& W {% u _
*@date 2007.1.16
6 a3 z: }6 h, N! O+ M' ?*/
5 ]: D3 s& Q- Z1 j) E#ifndef _UTF8CONV_H_
: f: Z& Y. z- l) _( ]9 m- S#define _UTF8CONV_H_. }& H$ q( u1 S7 x
j7 M; D) i! k4 k- l3 @$ d$ M' X: P9 _7 O
#ifdef WIN328 U6 G( t1 Y" S3 _9 W
#include <windows.h>6 q- k z8 C6 Y1 w
#include <winnls.h>7 z# m4 h+ `5 }" a Y
#else
1 x% g, w/ E" [, v) ~#include <stdio.h>2 m5 S5 `. Y' a; E( Q
#include <iconv.h>4 G6 G+ H: i$ w; `& ^* ^0 V
#endif
2 r& h/ S; S% R2 v# s" a8 u, {: i
% L* D& U" Q' y U' A#include<string>1 x9 {. |. D4 r+ c v/ A- i& Y! |
! ?% f" H+ J+ {7 q o! j( Q9 U7 j, C
class UTF8Conv' _% [6 P3 Q3 q( E4 b! x
{2 @6 K5 Q* b# c+ m7 `* P
public:* C. J( ]/ U. G
static int codepage(const char* code_page);# d6 h/ Y% v4 |
- c5 I& |! `& W% E static int dbcs2wchar(const char* code_page,/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max) ;! f0 ^, a8 O% ~- x- \- q9 [
# R5 W# ]; ~! n5 g' ^2 p; d
static int dbcs2wchar(const char* code_page,/*in*/const std::string& in,/*out*/std::wstring& out);% B2 [8 x8 d g
/ R( C! r; C& R2 Y static int wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max) ;
0 n. ]2 \5 H7 {+ z; z2 x& ~! i2 @. l% |. n
static int wchar2dbcs(const char* code_page,/*in*/const std::wstring& in,/*out*/std::string& out) ;
" J& O/ h$ }+ s
: ?7 O! p5 f* `* G0 Y6 o, M& |& d static int wchar2utf8(/*in*/const wchar_t* in,int in_len,/*out*/char* out,int out_max);
\5 a ] ^# o9 m
; e- @- M$ v4 m2 M static int wchar2utf8(/*in*/const std::wstring& in,/*out*/std::string& out);) m, s3 N2 L8 d2 d3 [
$ M. H( m; r( b6 R/ W( J
static int utf82wchar(/*in*/const char* in,int in_len,/*out*/wchar_t* out,int out_max);; C* C6 V( s0 j- Y0 a
$ K, D) t. d: n" `; t1 E- v static int utf82wchar(/*in*/const std::string& in,/*out*/std::wstring& out);
" K c! s5 A! \, M/ F};
3 n- ]+ k* |, h/ o5 m6 T* [+ [' O9 x" G8 l( c- A
6 B/ g1 y. `" {4 k! y" D0 |
2 B; w6 ?5 [% `! I7 T1 R! S- r$ O* S6 Y3 c9 F# D1 ~7 X
0 ?; ~, K7 K+ M% o. K g. e7 A; ?
% a9 Z( H% K, H5 V! d7 e s
$ n& F! a# U/ H7 w
0 r0 }! M7 Y* P/ r% E
$ k( G% F6 E, S- }2 y. n: z9 d1 d4 D- C
w2 s; O- u- F5 f5 ^' L
% p, s4 g7 C- ] U6 z
, f* o* }5 A/ \4 k
8 T$ |3 ~$ Q6 g) u: `" I6 K8 W% v* f+ S% }' X% l, f# y/ Y
- w, R4 U2 k1 r. j1 e5 D) i5 W- G1 [* c$ @* \, A
, ~8 Q- R" N8 I1 e M
. l# o+ M8 Q8 c( y: [1 G0 C* z. t: f; v; G5 z: x4 P3 I9 Q2 p
R7 g# e& u ?, K. S" `
; z3 o: G! _" W9 ]
k7 H0 G! f+ c" r, k. `7 D6 p
3 R' y" n: F( d% [, ~% T8 w g" d0 ?, f8 j9 O8 t5 \
, `0 c' y- j1 }9 p4 i* u$ H- Z
- Y* g9 M L L- g
! v: E( u8 a1 o; s* ?#endif |