中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
unicode 如何转换为ASCII?
作者:未知 时间:2005-09-13 19:22 出处:ChinaUnix.net 责编:chinaitpower
              摘要:unicode 如何转换为ASCII?

源码在此!没有调用任何操作系统函数,不过码表不给了,太大了!

老是有人发信要我解决 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个文件即可,好在文件不大,可以全部加载到内存中!但是要比较时注意字节顺序

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有