Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2675538
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: 嵌入式

2014-08-27 12:59:02


请问要把GB18030转成UNICODE有简单的算法
还要一定要用查表法?
谢谢

--------------------------------------------------------------------------------

ditto2002-07-01, 07:26


------------------------------------------
Microsoft GB18030 支持工具包 
自述文件 
2001 年 8 月 
------------------------------------------
(c) 版权所有 Microsoft Corporation 2001。保留所有权利。 


---------------
如何使用本文档
非BMP字符可以用简单公式与GB18030码互转。

下面给出Unicode到GB18030的转换例程,供大家参考。
GB18030转换到Unicode也一样简单,雷同处理。

更多分析过程可以参考前不久发的“GB18030的优缺点”一贴。


// 为了表达更清晰,下面把BMP字符和非BMP字符分开为两个例程,其实也可以连在一起。
//(1)Unicode BMP转GB18030的算法实例:
  1. static unsigned int TT[15536]=
  2. { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF
  3. ,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F
  4. ,0x20,0x21,0x22,0x23,0xA1E8,0x24,0x25,0xA1EC,0xA1A7,0x26,0x27,
  5. //...此处转换表可根据上贴附件自行生成,这里只是示例,故略去...
  6. };

  7. int u2gbe1(unsigned long uc) //输入unicode BMP字符码值(U+0000..U+FFFF)
  8. {
  9.    printf("U+%lX ", uc);
  10.    if (uc<0x80) //输出ASCII单字节字符
  11.    {
  12.       printf("G+%4lX %c\n", cc, cc); return 0; 
  13.    }

  14.    unsigned long cc=TT[uc-0x80];
  15.    if (cc>0x8000) //输出GBK汉字
  16.    {
  17.       printf("G+%4lX %c%c\n", cc, (char)(cc>>8), (char)cc); return 0; 
  18.    }

  19.    if (uc>0xD541) cc+=32768;

  20.    int c4=cc%10;
  21.    int c3=cc/10;
  22.    int c2=c3/126; c3%=126;
  23.    int c1=c2/10;  c2%=10;

  24.    //输出扩展1区
  25.    printf("G+%02X%02X%02X%02X ", 0x81+c1, 0x30+c2, 0x81+c3, 0x30+c4);
  26.    printf("%c%c%c%c\n", 0x81+c1, 0x30+c2, 0x81+c3, 0x30+c4);
  27.    return 0;
  28. }
复制代码


//(2)Unicode 扩展平面 转GB18030的算法实例:
  1. void u2gbe2(unsigned long uc) //输入Unicode 非BMP字符码值(U+10000..U+10FFFF)
  2. {
  3.    printf("U+%lX ", uc);
  4.    uc-=0x10000;
  5.    int c4=uc%10;
  6.    int c3=uc/10;
  7.    int c2=c3/126; c3%=126;
  8.    int c1=c2/10;  c2%=10;

  9.    printf("G+%02X%02X%02X%02X ", 0x90+c1, 0x30+c2, 0x81+c3, 0x30+c4);
  10.    printf("%c%c%c%c\n", 0x90+c1, 0x30+c2, 0x81+c3, 0x30+c4);
  11. }

請说明unicode与gh18030的对应关系

GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。 例如:UCS的0x3400在GB18030中的编码应该是8139EF30,UCS的0x3401在GB18030中的编码应该是8139EF31。

請说明unicode与gh18030的对应关系,谢谢
阅读(1897) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~