|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A : 4 E' u O9 i; Y4 x0 `, E y# }) s
include % b W) f9 V. E2 P! W3 i% p/ }, N# M
#include
3 P" @" S6 B2 l0 j: \" W#include ; C- G8 r/ P/ ]$ Q% |( u2 S2 S
#include
' S; k* I- |9 B#include
" ^ G6 @9 O" i/ \7 i! v% f7 z) e4 x
char * j2f(char *s)
! C% H1 I* p6 [( L: ~{
1 V/ Q$ n+ t% A- Y3 ^" G int n=strlen(s);0 n8 F7 p5 m7 i2 Z" q
int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);" r* i4 W- m+ G3 I& d# s
if (!r)
: e' ?. | t$ O8 {0 B return NULL;
/ o# v; z; ]4 n& |" C! B char *ft=new char[r+1];
3 a& h5 ^; T' s0 A9 y* h+ O r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来1 L" G' T7 |8 {) ~* g
if (r) {
v7 e+ u8 ~7 N9 J ft[r]=0;
4 d3 q1 j2 Y6 m0 z/ R; D wchar_t *pws=new wchar_t[r+1];
, Z' ] l9 D2 F# ^) _0 s& Q4 k9 n int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);$ A7 V. O! f0 p' H1 R
BOOL f=FALSE;
, l8 d8 K5 ]* {, }5 l' t- O r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5: v. r; e# {; f
ft[r1]=0;8 @0 r" y/ F" G' @' j
delete [] pws;& Y* s$ T- M7 o0 W3 {& p
}" N# K4 [- \$ P1 I- b: p/ u& T
strncpy(s,ft strlen(s));
" }6 l/ [, H1 a$ {3 \0 Z7 d delete []ft;' ^) Q" ~: p; J3 ~) ?. P. I( L) {/ j
return s;
& u% i4 [2 G" S, ]4 i f} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|