|
|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A : 0 ^5 I; u+ W6 m+ v
include 6 l- a+ b- o, K9 Q
#include
1 W- U g* G# t# W7 B9 f#include
5 O8 s& S; q7 {* l3 M0 j#include
. A% p/ B6 Q& L. e: G#include d- I% W$ l7 e) Q' Q/ d; G
+ ]4 J1 y7 T. e/ i3 @char * j2f(char *s)
" h/ ~$ A5 {, d3 j{& f) ^$ J+ k% z
int n=strlen(s);1 O$ m5 R" i% b9 X6 O7 Y
int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);
( A% | {7 G+ N% @ y; _ if (!r)
5 ]) @; W% g6 D7 o2 u/ C; ] return NULL;
. K4 P9 e% N# i% t k- [3 w1 j char *ft=new char[r+1];2 [9 d& G/ Y+ v2 p) e% I6 z
r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来
8 ^# h; v0 g. W2 y if (r) {
: k' _6 `/ K* R# E8 n- D ft[r]=0;% U4 T: C# w% c. Y! y" k
wchar_t *pws=new wchar_t[r+1];! |% ~. e9 [% o; L; N
int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);" T4 `4 g8 u8 Y5 o7 @7 f" Z. D
BOOL f=FALSE;) Z1 Z$ M9 }* m: a- R! J# d
r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5+ K8 ^' k6 J, R0 `3 w# k
ft[r1]=0;. G( ]9 ]. D7 y2 T0 E
delete [] pws;& f0 U# a: g" u6 f
}, `$ O8 p3 A2 S. C# m8 z& |
strncpy(s,ft strlen(s));
6 A6 t/ Q4 y' Q3 m1 ^ delete []ft;. T0 e3 i+ i) a, y# B5 e1 `$ W
return s; , [* Z4 M+ S2 c, H% w& p
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|