|
|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A :
+ V2 [$ L6 }7 y) r* o3 N4 a! N' Minclude 5 N- g1 m3 ?' T( q& _ i5 T
#include 0 |: v d- D& H& E6 n) p8 E
#include 8 ^) g7 X6 `3 Y3 b' p
#include
. e/ K3 C P- Y6 K1 d9 \& I5 C#include
- e! F4 n0 g* _6 I/ |8 r' K# g# T2 N+ d' S% u) V; A( L2 {
char * j2f(char *s)
9 v6 w6 ]+ r/ T* b( W. C, B{5 m+ O( \8 U$ a C. e) F5 p2 Q
int n=strlen(s);
, b3 F$ L& c# s3 D! { int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);
% Z4 H, @4 D0 S; q if (!r)
9 R6 a& G! m- ~& I% I return NULL;
% w$ r5 v4 f4 b! M5 N char *ft=new char[r+1];
4 P s' H) ~2 J! Q' X r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来
3 \4 k6 N( z1 N/ z0 m% F if (r) {
0 X; t7 E& ?1 h# l5 K. a0 a ft[r]=0;
' k: L! c( c1 @ wchar_t *pws=new wchar_t[r+1];9 a: l8 C4 _7 K
int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);
3 H1 g& K; V5 t. N7 ?( Y; x" [2 e BOOL f=FALSE;
9 c2 L$ j4 _3 o% \& y r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big51 X0 K- t% {; `9 M: F
ft[r1]=0;
4 ~5 o( W$ \; x8 a delete [] pws;5 t( ]9 k/ r( y; ^, v* D
}/ i2 a7 ?0 Z# M
strncpy(s,ft strlen(s));
9 [! D! a/ q7 W" e delete []ft;
( y" g; R8 p E+ T% ^3 ^ return s;
% Y# r, X# P( q8 r} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|