|
|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A : 0 A6 ^; K% G" @/ _( d
include 7 S3 q8 T: M# W% y% A& h* \
#include $ B0 \, U2 A3 _( S7 h
#include - m: ?$ G2 R' R3 i; F% Y
#include
6 D2 b8 O# q. F' r) j+ d( G#include : c. O$ U: o$ ~
. D4 g1 j; X' n9 X/ w
char * j2f(char *s)% r/ y& d( Q0 A' n1 C% Z5 ~/ D
{
' x- z- d% s0 x int n=strlen(s);! r+ [, C5 l. i$ V
int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);* M3 G6 X* l& L
if (!r)7 o* \1 P# ^5 s" q( m1 \
return NULL;! f: R% Y: `6 v
char *ft=new char[r+1];
0 p/ N$ k1 G. B) W" D; m% N1 j r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来$ W6 Q8 O. @( x1 u9 n! S# j* E
if (r) {* X" A/ A- n# T/ W( V. P% t$ Q
ft[r]=0;( E7 u! g& k# m) q/ G. D
wchar_t *pws=new wchar_t[r+1];
, T+ e# E1 }% q4 T( A int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);8 l" y% E" m$ `
BOOL f=FALSE;: q; n4 B$ g5 t- Q: x/ i5 z
r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big50 }8 d2 P% y6 h- V
ft[r1]=0;) y/ U: C: `" @* T. u- C
delete [] pws;* Q5 Q. N u* @
}" n) X5 c# H3 P6 `: t( j
strncpy(s,ft strlen(s));
* t7 j" \, B6 w3 f9 l delete []ft;7 ?1 _% ^0 X7 N$ Y; v; q+ ~2 @
return s; & l" o0 N8 N, U
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|