|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A :
; V% b' U5 `0 D4 L( sinclude & m% y7 D' o1 B0 u9 G9 ]- }5 ?, t) U" ]
#include ) ~6 x8 Y# N! T$ _4 v7 ~. P
#include
+ g- o* P; B- o0 P# s: v! i! n#include
: X( @* I% n; [; i7 c#include , \3 X, E. e4 I6 Z3 @; e
1 A4 z2 ^& a! A, i8 X [/ @( w
char * j2f(char *s)
$ X5 h7 Y. C% }$ w$ F5 R& X{
% ?3 T8 W0 Z' E int n=strlen(s);
8 D+ ~* P" `+ f3 B3 k6 ]# |/ a Z0 b int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);, M# Y+ q |2 T2 d
if (!r)0 w u6 K" u, E4 a! Y
return NULL;( w& _6 I4 q' ]7 A
char *ft=new char[r+1];
- V# X/ C3 z0 x+ F( Q r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来
! U) P. r. F( x! L if (r) {: x; I. n4 Z4 X4 x: T4 M
ft[r]=0;- Y# |( D8 z& [
wchar_t *pws=new wchar_t[r+1];' G4 [$ C" r2 H$ X5 i* Y. {; i
int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);
0 ~5 ?# K9 g) l BOOL f=FALSE;* C( h3 `0 i! n- b$ {+ ~
r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5* `7 m* [. p) k2 B) W- [2 v
ft[r1]=0;1 m& t8 O, W" Q# C4 T
delete [] pws;' d4 P( a( {- j0 V% {7 b1 I- w
}
& F+ E8 V" B' _3 F6 q3 l strncpy(s,ft strlen(s));
9 ~( H- y: ~$ S8 K3 `8 T" x7 b delete []ft;
9 m5 O2 c: J8 x. Q$ M, _ return s; 2 D) j5 Z' S6 ^- E6 r6 ~4 B2 W
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|