|
|
源码在此!没有调用任何操作系统函数,不过码表不给了,太大了!
老是有人发信要我解决 Unicode 到 GB 的编码问题,我在此贴代码算了,免得再找我
程序在FressBSD/Linux上调试通过,Windows 用户只要修改几个变量类型和头文件即可
说明:函数名称
int strUnicode2GB(char *strSourcer, char *strDest,int n)
转换Unicde字符串到GB码,返回汉字数
输入( Unicode 源串,GB2312/ASCII混合编码串,Unicode字节数 必须是偶数!!!)
[code:1:0a0b72ed53]
#include <sys/types.h>
const unsigned short int Unicode_GB2312[][2] =
{
/*Unicode ,GB||ASCII ,MEMO*/
0x0000,0x0040,/* 0 COMMERCIAL AT @ */
0x0001,0x00A3,/* 1 POUND SIGN £ */
0x0002,0x0024,/* 2 DOLLAR SIGN $ */
0x0003,0x00A5,/* 3 YEN SIGN ¥ */
0x0004,0x00E8,/* 4 LATIN SMALL LETTER E WITH GRAVE è */
.............
.............
码表太长了 请尽量通过 Google 查询,多的是
或者通过 stevenkoh@sohu.com 向我索取
0xFF5C,0xA3FC,/* '|' -> 65372 */
0xFF5D,0xA3FD,/* '}' -> 65373 */
0xFF5E,0xA1AB,/* '~' -> 65374 */
0xFFE0,0xA1E9,/* '¢' -> 65504 */
0xFFE1,0xA1EA,/* '£' -> 65505 */
0xFFE3,0xA3FE,/* ' ̄' -> 65507 */
0xFFE5,0xA3A4,/* '¥' -> 65509 */
};
u_int16_t Unicode2GBcode(u_int16_t iUnicode)
{
int i,j,n;
switch (iUnicode){
case 0x0002:
return 0x24;
break;
case 0x000a:
return 0xa;
break;
case 0x000d:
return 0xd;
break;
case 0x0040:
return 0xA1;
break;
}
if ((iUnicode>=0x20&&iUnicode<=0x5a)||(iUnicode>=0x61&&iUnicode<=0x7a)) return iUnicode;
for (i=0,j=0,n=sizeof(Unicode_GB2312)/sizeof(Unicode_GB2312[0])-1;n>0;n>>=1,++j){
if(Unicode_GB2312[i][0]==iUnicode) return Unicode_GB2312[i][1];
if (j>1){
if(Unicode_GB2312[i-1][0]==iUnicode) return Unicode_GB2312[i-1][1];
if(Unicode_GB2312[i+1][0]==iUnicode) return Unicode_GB2312[i+1][1];
}
if (Unicode_GB2312[i][0]<iUnicode) i=i+n;
else i=i-n;
}
if(Unicode_GB2312[i][0]==iUnicode) return Unicode_GB2312[i][1];
if(Unicode_GB2312[i-1][0]==iUnicode) return Unicode_GB2312[i-1][1];
if(Unicode_GB2312[i+1][0]==iUnicode) return Unicode_GB2312[i+1][1];
return 0; //转换不成功
}
/*转换Unicde字符串到GB码,返回汉字数*/
int strUnicode2GB(const char *strSourcer,const char *strDest,int n)
{
char cTmp;
u_int16_t hz,tmphz;
char *pSrc;
char *pDest;
int i;
for (i=0,pSrc=strSourcer,pDest=strDest;n>0;n-=2,pSrc+=2,++i,++pDest){
hz=0;
hz=*pSrc<<8|(*(pSrc+1)&0x00FF);
tmphz=Unicode2GBcode(hz);
if (!tmphz||tmphz>0x7F&&tmphz<0xFF){
*pDest='.';
continue;
}
else if (tmphz>0x00&&tmphz<=0x7F){
cTmp=tmphz;
*pDest=cTmp;
}
else{
cTmp=tmphz;
*pDest=(tmphz>>=8);
++pDest;
*pDest=cTmp;
}
}
*pDest='\0';
return i;
}
[/code:1:0a0b72ed53]
希望您对大家有帮助!至于GB->Unicode,我想就算了,反正网关可以支持的。
| 无双 回复于:2003-05-23 13:07:05
| 谢谢楼上的给出
让大家参考
| | opcx 回复于:2003-05-23 13:06:51
| 说明:函数名称
int strUnicode2GB(char *strSourcer, char *strDest,int n)
转换Unicde字符串到GB码,返回汉字数
输入( Unicode 源串,GB2312/ASCII混合编码串,Unicode字节数 必须是偶数!!!)
| | wangz 回复于:2003-05-23 13:17:37
| 
| | kinghood 回复于:2003-05-23 14:10:01
| win下转换很容易,根本不用什么码表
unix下除了码表有没有别的方法呢?
| | jianleon_007 回复于:2003-06-19 19:12:28
| "hz=*pSrc<<8|(*(pSrc+1)&0x00FF); "以两个字节的unicode串作为的转换函数的输入,不理解,能解释或看看你的unicode串吗?
另外得到gb2312的编码后该怎样处理才能使字符正常显示出来?
“*pDest=(tmphz>>=;”这段源码有缺漏,能补上吗?
| | gadfly 回复于:2003-06-19 21:48:16
| 帮你改了一下,用code包含,方便大家看。
另外iconv库包含多种编码的转换,在linux上已经是glibc库的一部分。
其它的unix os也可以单独安装使用。
| | qq16311349 回复于:2003-08-13 10:04:23
| [quote:4d0d8d89af="jianleon_007"]"hz=*pSrc<<8|(*(pSrc+1)&0x00FF); "以两个字节的unicode串作为的转换函数的输入,不理解,能解释或看看你的unicode串吗?
另外得到gb2312的编码后该怎样处理才能使字符正常显示出来?
“*pDest=(tmphz>&..........[/quote:4d0d8d89af]
你好,用WIN的机器,请问能否告知UNICODE->GB的代码,上面有点不理解,谢谢
| | superchao 回复于:2003-10-30 18:49:21
| unicode的ASCII到ASCII转换简单,去掉首字节0即可。
汉字转换,可以如下,首先将汉字全部打印出来到一个文本文件,然后使用ultraedit转存成unicode格式,转换时对照2个文件即可,好在文件不大,可以全部加载到内存中!但是要比较时注意字节顺序
| |
|