|
|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A : ) k3 B/ }, k! v
include 9 M1 X8 L) z% _) B: K0 e* M
#include : U6 F' R2 r% L- l) I( B
#include
. h, o6 y7 @; m$ y5 I" G6 ~ I. j#include 8 f. A2 \! n7 K, T! H* \
#include # t/ ~" T, s& V6 Q! b2 ^! t( o
3 w1 D D! C3 X/ A5 ochar * j2f(char *s)
/ B3 R |5 ?* O! C4 }; t- |9 w{
, o' f h: _8 v' n& q4 h: T int n=strlen(s);
3 r1 Z# @1 A4 M, d% A int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);
: ^8 e u) [. q4 k* ` if (!r)
/ u% o' Q9 f* A& s return NULL;( H: s( g/ I4 C. J
char *ft=new char[r+1];
! j0 S$ `+ j! a/ u' }! A! N r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来, W* L' z: U! H! b) I
if (r) {2 K$ i1 c7 N( b5 [8 M8 z7 R
ft[r]=0;
; G9 o5 L4 c) ~. p: X, i wchar_t *pws=new wchar_t[r+1];! f- L- d; Q: [5 `; B
int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);: i6 z2 Y& N$ Q4 o
BOOL f=FALSE;/ s5 l. M' z3 B- E: W
r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big5
% w* v( [+ r( |( K ft[r1]=0;/ O4 \$ L1 t3 V- [7 ]& `
delete [] pws;
) h4 `& G# h+ X. q) H; c }
5 V% C+ k& n3 ?/ j6 N2 r strncpy(s,ft strlen(s));
. N: t8 B( Q* O5 y: i( z delete []ft;$ R9 c; C4 k$ {/ {/ |
return s; ; j# _4 T) R, k- a/ ?" }
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|