免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14945 | 回复: 8
打印 上一主题 下一主题

unicode 如何转换为ASCII? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-23 13:06 |只看该作者 |倒序浏览
源码在此!没有调用任何操作系统函数,不过码表不给了,太大了!

老是有人发信要我解决 Unicode 到 GB 的编码问题,我在此贴代码算了,免得再找我

程序在FressBSD/Linux上调试通过,Windows 用户只要修改几个变量类型和头文件即可

说明:函数名称
int strUnicode2GB(char *strSourcer, char *strDest,int n)

转换Unicde字符串到GB码,返回汉字数
输入( Unicode 源串,GB2312/ASCII混合编码串,Unicode字节数 必须是偶数!!!)



  1. #include <sys/types.h>;

  2. const unsigned short int Unicode_GB2312[][2] =
  3. {

  4. /*Unicode ,GB||ASCII ,MEMO*/
  5. 0x0000,0x0040,/* 0 COMMERCIAL AT @ */
  6. 0x0001,0x00A3,/* 1 POUND SIGN £ */
  7. 0x0002,0x0024,/* 2 DOLLAR SIGN $ */
  8. 0x0003,0x00A5,/* 3 YEN SIGN ¥ */
  9. 0x0004,0x00E8,/* 4 LATIN SMALL LETTER E WITH GRAVE è */

  10. .............
  11. .............
  12. 码表太长了 请尽量通过 Google 查询,多的是
  13. 或者通过 stevenkoh@sohu.com 向我索取

  14. 0xFF5C,0xA3FC,/* '|' ->; 65372 */
  15. 0xFF5D,0xA3FD,/* '}' ->; 65373 */
  16. 0xFF5E,0xA1AB,/* '~' ->; 65374 */
  17. 0xFFE0,0xA1E9,/* '¢' ->; 65504 */
  18. 0xFFE1,0xA1EA,/* '£' ->; 65505 */
  19. 0xFFE3,0xA3FE,/* ' ̄' ->; 65507 */
  20. 0xFFE5,0xA3A4,/* '¥' ->; 65509 */


  21. };

  22. u_int16_t Unicode2GBcode(u_int16_t iUnicode)
  23. {
  24. int i,j,n;

  25. switch (iUnicode){
  26. case 0x0002:
  27. return 0x24;
  28. break;
  29. case 0x000a:
  30. return 0xa;
  31. break;
  32. case 0x000d:
  33. return 0xd;
  34. break;
  35. case 0x0040:
  36. return 0xA1;
  37. break;
  38. }

  39. if ((iUnicode>;=0x20&&iUnicode<=0x5a)||(iUnicode>;=0x61&&iUnicode<=0x7a)) return iUnicode;


  40. for (i=0,j=0,n=sizeof(Unicode_GB2312)/sizeof(Unicode_GB2312[0])-1;n>;0;n>;>;=1,++j){

  41. if(Unicode_GB2312[i][0]==iUnicode) return Unicode_GB2312[i][1];

  42. if (j>;1){
  43. if(Unicode_GB2312[i-1][0]==iUnicode) return Unicode_GB2312[i-1][1];
  44. if(Unicode_GB2312[i+1][0]==iUnicode) return Unicode_GB2312[i+1][1];
  45. }

  46. if (Unicode_GB2312[i][0]<iUnicode) i=i+n;
  47. else i=i-n;
  48. }

  49. if(Unicode_GB2312[i][0]==iUnicode) return Unicode_GB2312[i][1];
  50. if(Unicode_GB2312[i-1][0]==iUnicode) return Unicode_GB2312[i-1][1];
  51. if(Unicode_GB2312[i+1][0]==iUnicode) return Unicode_GB2312[i+1][1];

  52. return 0; //转换不成功
  53. }


  54. /*转换Unicde字符串到GB码,返回汉字数*/
  55. int strUnicode2GB(const char *strSourcer,const char *strDest,int n)
  56. {
  57. char cTmp;
  58. u_int16_t hz,tmphz;

  59. char *pSrc;
  60. char *pDest;

  61. int i;


  62. for (i=0,pSrc=strSourcer,pDest=strDest;n>;0;n-=2,pSrc+=2,++i,++pDest){

  63. hz=0;
  64. hz=*pSrc<<8|(*(pSrc+1)&0x00FF);
  65. tmphz=Unicode2GBcode(hz);

  66. if (!tmphz||tmphz>;0x7F&&tmphz<0xFF){
  67. *pDest='.';
  68. continue;
  69. }
  70. else if (tmphz>;0x00&&tmphz<=0x7F){
  71. cTmp=tmphz;
  72. *pDest=cTmp;
  73. }
  74. else{
  75. cTmp=tmphz;
  76. *pDest=(tmphz>;>;=8);
  77. ++pDest;
  78. *pDest=cTmp;
  79. }
  80. }

  81. *pDest='\0';
  82. return i;

  83. }
复制代码

希望您对大家有帮助!至于GB->;Unicode,我想就算了,反正网关可以支持的。

论坛徽章:
0
2 [报告]
发表于 2003-05-23 13:06 |只看该作者

unicode 如何转换为ASCII?

说明:函数名称
int strUnicode2GB(char *strSourcer, char *strDest,int n)

转换Unicde字符串到GB码,返回汉字数
输入( Unicode 源串,GB2312/ASCII混合编码串,Unicode字节数 必须是偶数!!!)

论坛徽章:
0
3 [报告]
发表于 2003-05-23 13:07 |只看该作者

unicode 如何转换为ASCII?

谢谢楼上的给出
让大家参考

论坛徽章:
0
4 [报告]
发表于 2003-05-23 13:17 |只看该作者

unicode 如何转换为ASCII?

论坛徽章:
0
5 [报告]
发表于 2003-05-23 14:10 |只看该作者

unicode 如何转换为ASCII?

win下转换很容易,根本不用什么码表
unix下除了码表有没有别的方法呢?

论坛徽章:
0
6 [报告]
发表于 2003-06-19 19:12 |只看该作者

unicode 如何转换为ASCII?

"hz=*pSrc<<8|(*(pSrc+1)&0x00FF); "以两个字节的unicode串作为的转换函数的输入,不理解,能解释或看看你的unicode串吗?
另外得到gb2312的编码后该怎样处理才能使字符正常显示出来?
“*pDest=(tmphz>;>;=;”这段源码有缺漏,能补上吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-06-19 21:48 |只看该作者

unicode 如何转换为ASCII?

帮你改了一下,用code包含,方便大家看。

另外iconv库包含多种编码的转换,在linux上已经是glibc库的一部分。

其它的unix os也可以单独安装使用。

论坛徽章:
0
8 [报告]
发表于 2003-08-13 10:04 |只看该作者

unicode 如何转换为ASCII?

原帖由 "jianleon_007" 发表:
"hz=*pSrc<<8|(*(pSrc+1)&0x00FF); "以两个字节的unicode串作为的转换函数的输入,不理解,能解释或看看你的unicode串吗?
另外得到gb2312的编码后该怎样处理才能使字符正常显示出来?
“*pDest=(tmphz>;&..........
   


你好,用WIN的机器,请问能否告知UNICODE->;GB的代码,上面有点不理解,谢谢
superchao 该用户已被删除
9 [报告]
发表于 2003-10-30 18:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP