|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A :
7 _8 J+ j# g/ C" k0 pinclude
v2 S/ s3 k+ G( q#include ( _; T2 |, d: t7 D0 C
#include 8 W, j/ \0 e* {7 k* i
#include 1 A) l8 O. X: x0 J' ^. f7 ?# G% P
#include
+ A: V$ i8 K( x6 `
; X# M% u/ B0 Tchar * j2f(char *s)5 Z+ q3 \, {: B+ n( A5 x
{9 W9 }. u9 Q- ^1 i8 M1 `
int n=strlen(s);
& J k) R% B3 W; Y; Z. \ int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);; ]6 E# C( K6 s, h9 B) S) y! W
if (!r)
- {, C) \, q! r return NULL;
4 r& P+ H' a! F7 q& D" b char *ft=new char[r+1];$ X5 e/ H' x0 w; X
r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来: |! |' s( @! L) x* O1 [* J
if (r) {
# O7 t. k! C! C" m' O, Z) y/ g, r( I ft[r]=0;
2 n" L: ?" e, Z+ m- P: J2 A wchar_t *pws=new wchar_t[r+1]; L2 Q# U' N5 b! c2 g$ ~
int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);1 X& \, _ ]. H2 Y
BOOL f=FALSE;
( x5 I& G' ^" _) V! J r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5
$ L9 P7 R, a- n. m+ }8 Z6 T ft[r1]=0;
/ x" {8 e G$ H C( I, b delete [] pws;; Q# M7 k3 R. A8 Q' R$ h1 M
}
- ~: ^% x1 `2 O L strncpy(s,ft strlen(s));4 h2 o* r1 i/ T
delete []ft;
9 z/ K+ h: H y return s; $ R3 Y# E9 j, F. p( o5 e
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|