|
利用Windows系统自带的简繁体转换的代码,效率较高,能够很好的完成GB2312、GBK到BIG5的转换 主要解答者: taogx 提交人: taogx 感谢: taogx 审核者: flyelf 论坛对应贴子: 查看 A :
' B4 A/ D" x1 C i: Rinclude # h z! F. |. e) W7 |! ?- q
#include ) E3 F8 o) @% j# B% x: ^/ n
#include 1 {' R+ b* n0 N9 A$ L+ v2 v
#include 6 i# z" C/ J; A6 x) `
#include
! m# m/ N8 y, l7 V; h: h$ F- K
/ \, z. R. L- Nchar * j2f(char *s)
6 ` `' [7 `* P+ L{
; h6 f6 ?6 W; ~/ ~" K5 e int n=strlen(s);8 j! h) A' Z' p7 c7 A& d/ e# S
int r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s), NULL,0);
7 n+ L) i. g7 _, ^ a if (!r)4 a9 Y7 F; }, i7 L8 B% {! g- J, x, ^
return NULL;
0 Y, [9 d: v7 @1 h char *ft=new char[r+1];
) O J1 N% [( P. u$ D( U r=LCMapString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC),LCMAP_TRADITIONAL_CHINESE,s,strlen(s),ft,r+1);//这个api搞掂简体转繁体,下面会打?繁体出来' o& a* w3 \4 M
if (r) {
2 g7 J% l0 U' Y4 P6 F6 f$ l- r- Y9 j ft[r]=0;5 e/ C. D) l7 ]& l" @+ ^% r; V4 h
wchar_t *pws=new wchar_t[r+1];
% F3 ?2 x& j* A3 R$ F- L, H& T int r1=MultiByteToWideChar(936,0,ft,r,pws,r+1);1 L# [' w7 Z) {/ ]
BOOL f=FALSE;5 G' ]# C/ |% l' x* d. t
r1=WideCharToMultiByte(950,0,pws,r1,ft,r+1,"?",&f);//代码页切换搞掂gb->big58 z9 p/ l5 c/ } {2 |
ft[r1]=0;
( n2 N& x9 A; _7 c; |( J$ p: D8 ] delete [] pws; P1 A# e& @7 ~* J7 x3 R# Q
}( u$ M! L1 v* s( n7 Z% S9 Q
strncpy(s,ft strlen(s));
% Y' V$ v6 {, Q% g! x8 \" b delete []ft;
a/ ?" k4 Q) C9 t% v return s; ) s7 z$ i, y3 d1 v3 x
} 返回NULL表示失败,如果s为const型,需要提供输出缓冲区,否则你必须释放这个函数返回来的指针的空间。将 strncpy(s,ft,strlen(s)); return s; 这两句的改为缓冲区地址即可。 |
|