|
|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A : / m4 \. z. o' F z: z5 F
include ! Q7 o) M; \5 W
#include
4 k; z/ V, A' ?0 g( ] ?#include
" F* z, D. _+ K, V8 N4 z6 j1 }% ~/ S#include : z2 W2 z9 l/ _" o# r) `
#include
/ c8 T' v5 J$ b( x; M1 N5 @; P6 V/ o; c8 q: f" E/ U) z
char * j2f(char *s)4 e0 x3 X* `, {8 i( x1 F
{
5 F" c+ L7 L3 O% k4 j. d7 G int n=strlen(s);; k$ R% K! j8 R, i6 P- L3 V
int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);
7 i# ]7 Z6 K- Z, v, z) v if (!r)+ ~& H ?6 k0 w H, f% r2 B
return NULL; J6 H8 |$ c# a% n: D
char *ft=new char[r+1];
* v; Q8 u( C9 C6 k r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来& F: [5 f9 g% G9 e/ Y. P6 X
if (r) {
) T7 w# n% h/ b6 j) C$ s ft[r]=0;
2 C, {1 Q* S$ h; m, _* q5 X wchar_t *pws=new wchar_t[r+1];
3 A& q7 ]. B2 {4 X7 {1 H int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1); O- [7 [/ a. n; Q S& [ O
BOOL f=FALSE;
7 C( b, e, S0 K5 V$ Z+ C r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big58 O+ ~1 s r8 L% S- O& M% Z
ft[r1]=0;9 z) S! k) p- v3 l8 F( u1 Y
delete [] pws;! Z9 }; u1 K' Z7 D! R9 U
}
$ T# ], D( q$ b: c/ W5 ], g strncpy(s,ft strlen(s));2 V/ e. H. n v$ m+ x- k8 {
delete []ft;' W# q$ y Y9 V, q! U" g- u: l
return s; ( M3 e0 R7 ~9 E- l) h9 ?" Y
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|