|
|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A :
! t5 j2 x4 ]% v+ ~include
4 |- |2 b7 k. \#include
" u0 J( T2 ~6 t8 G#include
/ u1 C# M1 j; r) L9 E# H: {5 h. B#include 9 U8 m, B% b7 R" _6 x
#include 7 D% }) n$ Z6 c7 C7 x# f% t
7 z H1 B& u- ~& |. j6 c/ N9 j
char * j2f(char *s)
- |* d% P. z% U) E( @{3 d) B/ l# }/ v% f2 u1 C
int n=strlen(s);
+ ]9 H& w% e1 R int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);
8 m1 u- P6 {4 B if (!r)% c, Y2 h: a3 U8 x* b S2 {2 f
return NULL;
4 n( l$ d0 H7 B: j" N char *ft=new char[r+1];
5 V% n/ |" }1 \( u1 c% o r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来
0 c- d( f$ @: e3 P& j if (r) {
4 d8 N2 y/ x4 c& R6 H1 s B ft[r]=0;
/ y6 `' T A, l8 d: ]/ O wchar_t *pws=new wchar_t[r+1];% Q3 r% e- n4 G( J( O! v. |1 i
int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);% j7 `, O. ]$ u1 j' _
BOOL f=FALSE;
8 v( L. R1 |- p$ d# T r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5: k2 `+ D/ ]7 D8 n) K
ft[r1]=0;7 _+ E6 [: a5 V( y
delete [] pws;
" O& k) |6 O, \& z }; R3 U0 l/ B4 U. t4 b/ h
strncpy(s,ft strlen(s));. }$ A! u* v8 A: h; F6 o' I8 j: @
delete []ft;
" L2 ~% m0 T3 h( U) z% z. P return s; 3 p% }! k; c8 F- a0 l7 }
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|