Chinaunix

标题: unicode 如何转换为ASCII? [打印本页]

作者: opcx    时间: 2003-05-23 13:06
标题: unicode 如何转换为ASCII?
源码在此!没有调用任何操作系统函数,不过码表不给了,太大了!

老是有人发信要我解决 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,我想就算了,反正网关可以支持的。
作者: opcx    时间: 2003-05-23 13:06
标题: unicode 如何转换为ASCII?
说明:函数名称
int strUnicode2GB(char *strSourcer, char *strDest,int n)

转换Unicde字符串到GB码,返回汉字数
输入( Unicode 源串,GB2312/ASCII混合编码串,Unicode字节数 必须是偶数!!!)
作者: 无双    时间: 2003-05-23 13:07
标题: unicode 如何转换为ASCII?
谢谢楼上的给出
让大家参考
作者: wangz    时间: 2003-05-23 13:17
标题: unicode 如何转换为ASCII?

作者: kinghood    时间: 2003-05-23 14:10
标题: unicode 如何转换为ASCII?
win下转换很容易,根本不用什么码表
unix下除了码表有没有别的方法呢?
作者: jianleon_007    时间: 2003-06-19 19:12
标题: unicode 如何转换为ASCII?
"hz=*pSrc<<8|(*(pSrc+1)&0x00FF); "以两个字节的unicode串作为的转换函数的输入,不理解,能解释或看看你的unicode串吗?
另外得到gb2312的编码后该怎样处理才能使字符正常显示出来?
“*pDest=(tmphz>;>;=;”这段源码有缺漏,能补上吗?
作者: gadfly    时间: 2003-06-19 21:48
标题: unicode 如何转换为ASCII?
帮你改了一下,用code包含,方便大家看。

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

其它的unix os也可以单独安装使用。
作者: qq16311349    时间: 2003-08-13 10:04
标题: unicode 如何转换为ASCII?
原帖由 "jianleon_007" 发表:
"hz=*pSrc<<8|(*(pSrc+1)&0x00FF); "以两个字节的unicode串作为的转换函数的输入,不理解,能解释或看看你的unicode串吗?
另外得到gb2312的编码后该怎样处理才能使字符正常显示出来?
“*pDest=(tmphz>;&..........
   


你好,用WIN的机器,请问能否告知UNICODE->;GB的代码,上面有点不理解,谢谢
作者: superchao    时间: 2003-10-30 18:49
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2