|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A :
8 r! s% ?- _, F! zinclude 3 q8 [; }* M0 e# s9 P1 A
#include
- \) _: P+ o2 e' l#include 1 n+ x$ u+ c& L+ ^: R
#include
% C+ m1 S- u& T8 v#include * _) x. O1 W* P; h- t& j5 K* \5 t
. h% T( R5 Z: k* e E/ ~- achar * j2f(char *s)3 \; c+ T* ]4 T4 M0 C9 o
{
6 R5 S! W( y7 G* q& ? int n=strlen(s);
6 |8 Q8 {" ^" J# p8 l) A `. Q int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);2 E6 `, z1 L( b) G( ] ~, b. n
if (!r)
9 z" f3 f: g( \. T return NULL;; Y; U8 w5 l" M+ v4 e. o
char *ft=new char[r+1];
9 Z( P5 b0 N9 T% a- G0 B r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来: M% a! ~5 i3 k+ y6 R. w
if (r) {8 T: o0 }9 \$ J/ k2 D
ft[r]=0;
6 a% e) x" e9 R0 m, D& |7 b wchar_t *pws=new wchar_t[r+1];
6 \+ l" D. Q3 W3 ~1 ` int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);& i3 u- V9 X! ], W3 K
BOOL f=FALSE;# b: \7 u0 T0 b/ k' }5 P
r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5, M( W) R7 m4 f* |$ M! h
ft[r1]=0;
- t) I/ @5 ]7 e delete [] pws;! D2 ]( B, m% }1 g
}
+ N+ M8 S! @6 W1 k5 K9 D4 m- C strncpy(s,ft strlen(s));
! A; ]! \# Q9 r# H delete []ft;
$ \0 Q- v6 q+ Q return s; " ~* M, L6 p6 x/ C. e: h# \! L
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|