【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2757|回复: 2

用 API 作简繁体转换

[复制链接]
发表于 2006-6-9 15:39:19 | 显示全部楼层 |阅读模式
<>最近拿到一个台湾的引擎,测试以后发现只能显示繁体中文,为此专门搜集一些资料放在这里,以便查阅</P>
<>//--------------------------------------------------------------------------- <br>//函数输入Big5字符,返回Gb简体字符 <br>//--------------------------------------------------------------------------- <br>AnsiString __fastcall Big2Gb(AnsiString sBig) <br>{ <br>char* pszBig5=NULL; //Big5编码的字符 <br>wchar_t* wszUnicode=NULL; //Unicode编码的字符 <br>char* pszGbt=NULL; //Gb编码的繁体字符 <br>char* pszGbs=NULL; //Gb编码的简体字符 <br>AnsiString sGb; //返回的字符串 <br>int iLen=0; //需要转换的字符数 <br><br>pszBig5=sBig.c_str(); //读入需要转换的字符参数 <br><br>//计算转换的字符数 <br>iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0) ; <br>//给wszUnicode分配内存 <br>wszUnicode=new wchar_t[iLen+1]; <br>//转换Big5码到Unicode码,使用了API函数MultiByteToWideChar <br>MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen); <br><br>//计算转换的字符数 <br>iLen=WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ; <br>//给pszGbt分配内存 <br>pszGbt=new char[iLen+1]; <br>//给pszGbs分配内存 <br>pszGbs=new char[iLen+1]; <br>//转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte <br>WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ; <br><br>//转换Gb码繁体到Gb码简体,使用API函数LCMapString <br>LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen); <br><br>//返回Gb码简体字符 <br>sGb=pszGbs; <br><br>//释放内存 <br>delete [] wszUnicode; <br>delete [] pszGbt; <br>delete [] pszGbs; <br><br>return sGb; <br>} <br>2. 输入Gb字符,返回Big5字符 <br>//--------------------------------------------------------------------------- <br>//函数输入Gb字符,返回Big5字符 <br>//--------------------------------------------------------------------------- <br>AnsiString __fastcall Gb2Big(AnsiString sGb) <br>{ <br>char* pszGbt=NULL; //Gb编码的繁体字符 <br><br>char* pszGbs=NULL; //Gb编码的简体字符 <br>wchar_t* wszUnicode=NULL; //Unicode编码的字符 <br>char* pszBig5=NULL; //Big5编码的字符 <br>AnsiString sBig5; //返回的字符串 <br>int iLen=0; //需要转换的字符数 <br><br>pszGbs=sGb.c_str(); //读入需要转换的字符参数 <br><br>//计算转换的字符数 <br>iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0) ; <br><br>//给pszGbt分配内存 <br>pszGbt=new char[iLen*2+1]; <br>//转换Gb码简体到Gb码繁体,使用API函数LCMapString <br>LCMapString(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2); <br><br>//给wszUnicode分配内存 <br>wszUnicode=new wchar_t[iLen+1]; <br>//转换Gb码到Unicode码,使用了API函数MultiByteToWideChar <br>MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen); <br><br>//计算转换的字符数 <br>iLen=WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ; <br>//给pszBig5分配内存 <br>pszBig5=new char[iLen+1]; <br>//转换Unicode码到Big5码,使用API函数WideCharToMultiByte <br>WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, pszBig5,iLen, NULL, NULL) ; <br><br>//返回Big5码字符 <br>sBig5=pszBig5; <br><br>//释放内存 <br>delete [] wszUnicode; <br>delete [] pszGbt; <br>delete [] pszBig5; <br><br>return sBig5; <br>}   </P>
 楼主| 发表于 2006-6-9 16:02:31 | 显示全部楼层
可以看出中文转换关键就是要用API函数MultiByteToWideChar,<BR><BR>就是把 AnsiString 转成 WideString, 用 BCB 非常简单了 <BR>AnsiString s = "源字符串";<BR>WideString w = s; //w 就是转成 WideChar 的了,使用 w 就可以了<BR><BR>如果你想用 API 函数,参数如下:<BR>API 函数 MultiByteToWideChar <BR>第一个参数为代码页, 用 GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁体中文<BR>第二个参数为选项,一般用 0 就可以了<BR>第三个参数为 ANSI 字符串的地址, 这个字符串是第一个参数指定的语言的 ANSI 字符串 (AnsiString)<BR>第四个参数为 ANSI 字符串的长度,如果用 -1, 就表示是用 0 作为结束符的字符串<BR>第五个参数为转化生成的 unicode 字符串 (WideString) 的地址, 如果为 NULL, 就是代表计算生成的字符串的长度<BR>第六个参数为转化生成的 unicode 字符串缓存的容量<BR><BR>int BufSize = MultiByteToWideChar(936,0,s,-1,NULL,0); //计算简体中文字符串 s 转成 widestring 之后占用的内存字节数<BR>…… //在此处为 wsbuf 分配内存 BufSize 个字节<BR>MultiByteToWideChar(936,0,s,-1,wsbuf,BufSize); //把简体中文 AnsiString 字符串 s 转化为 unicode 的 WideString
 楼主| 发表于 2006-6-10 17:40:55 | 显示全部楼层
下面的源程序,将BIG5码文件转换为GB码文件。 <BR>//TURBO C++3.0 <BR>#include <STDIO.H><BR>#include <STDLIB.H><BR>void main(){ <BR>int que, wei; <BR>FILE * sourcefile; <BR>FILE * tabfile; <BR>FILE * destfile; <BR>sourcefile = fopen("big.txt', "r+b"); <BR>//BIG5 码文件 <BR>tabfile = fopen("table.txt", 'r+b"); <BR>//码表文件 <BR>destfile = fopen("gb.txt","w+b"); <BR>//转换生成的GB码文件 <BR>while (!feof(sourcefile)){ <BR>fread(&amp; que,1,1,sourcefile); <BR>if (feof(sourcefile)){ <BR>break; } <BR>if (que&gt; =0xa1 &amp;&amp; que &lt;=0xfe) <BR>//叛断是否汉字(BIG5编码) <BR>{fread(&amp; wei,1,1,sourcefile); <BR>if (wei&lt;0xa1) wei = wei - <B black; BACKGROUND-COLOR: #ffff66">0x40</B>; <BR>if (wei&gt;=0xa1) wei = wei - 0xa1 + <B black; BACKGROUND-COLOR: #a0ffff">0x7e</B> - <B black; BACKGROUND-COLOR: #ffff66">0x40</B> + 1; <BR>fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + <B black; BACKGROUND-COLOR: #a0ffff">0x7e</B> - <B black; BACKGROUND-COLOR: #ffff66">0x40</B> + 1 ) + wei), SEEK_SET); <BR>fread(&amp; que,1,1,tabfile); <BR>fread(&amp; wei,1,1,tabfile); <BR>fwrite(&amp; que,1,1,destfile); <BR>fwrite(&amp; wei,1,1,destfile); <BR>} <BR>else <BR>fwrite(&amp; que,1,1,destfile); //处理英文 <BR>} <BR>fclose(sourcefile); <BR>fclose(tabfile); <BR>fclose(destfile); <BR>return; <BR>} <BR>以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-6-22 16:47

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表