Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246688
  • 博文数量: 37
  • 博客积分: 837
  • 博客等级: 准尉
  • 技术积分: 566
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-26 17:36
文章分类

全部博文(37)

文章存档

2012年(31)

2011年(6)

我的朋友

分类: C/C++

2012-07-07 21:24:56

1.什么是UCS和ISO10646?

  国际标准ISO10646定义了通用字符集(Universal Character Set, UCS). UCS是所有其它字符集标准的一个超集,它保证也其它字符集双向兼容,即编码间相互转换不会丢失任何信息。UCS字符集U+0000到U+007F与 US-ASCII是一致的。
  
2.什么是UNICODE

  历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.
  
3.什么是UTF-8(一种传送和存储格式)

  UCS和UNICODE为每个字符分配了一个对应的整数,但并没有明确说明其实现机制.故存在多种编码方式,其中以两个字节和四个字节来存储一个字符的方法分别叫UCS-2, UCS-4,要将一个ASCII文件转换成一个UCS-2文件只要在每个字节前加一个字节0X00,转换成UCS-4只要在每个字节前加三个0X00。
  而Internet上大量的信息是以ASCII码存在的,如果都用两个字节来存储将浪费大量的资源,同时Unix和Linux下使用USC-2和USC-4会导致严重问题,于是出现了UTF-8(定义于ISO10646-1).
  UTF-8(UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.)

  UNICODE(UCS)和UTF-8的对应关系。

  U-00000000 - U-0000007F: 0xxxxxxx

  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx

  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

  在多字节串中,第一个字节的开头‘1’的数目就是整个串中字节的数目.

  下面举UCS-2与UTF-8的对应关系,并利用C语言实现之间的互相转化。
  ------------------------------------------------------------------|
  |               UCS2             |             UTF-8              |
  |-----------------------------------------------------------------|
  |               code             | 1st Byte | 2nd byte | 3rd Byte |
  |-----------------------------------------------------------------|
  | 000000000aaaaaaa | 0000 - 007F | 0aaaaaaa |          |          |
  |-----------------------------------------------------------------|
  | 00000bbbbbaaaaaa | 0080 - 07FF | 110bbbbb | 10aaaaaa |        |      
    |-----------------------------------------------------------------|
    | ccccbbbbbbaaaaaa | 0800 - FFFF | 1110cccc | 10bbbbbb | 10aaaaaa |
  |-----------------------------------------------------------------|
    C语言转换代码如下:

点击(此处)折叠或打开

  1. int UTF8toUCS2Code(UINT8* utf8_code, UINT16* ucs2_code)
  2. {
  3.     UINT16 temp1, temp2;
  4.     UINT16* out = ucs2_code;
  5.     UINT8* in = utf8_code;

  6.     int i = 0;
  7.     if(!utf8_code || !ucs2_code) {
  8.         return -1;
  9.     }
  10.     while(*in != '\0') {
  11.         if(0x00 == (*in & 0x80)) {
  12.             /* 1 byte UTF-8 Charater.*/
  13.             *out= (UINT16)*(in++);
  14.         }
  15.         else if(0xc0 == (*in & 0xe0) && 0x80 == (*(in + 1) & 0xc0)) {
  16.             /* 2 bytes UTF-8 Charater.*/
  17.             temp1 = (UINT16)(*(in++) & 0x1f);
  18.             temp1 <<= 6;
  19.             temp1 |= (UINT16)(*(in++) & 0x3f);
  20.             *out = temp1;
  21.         }
  22.         else if( 0xe0 == (*in & 0xf0) &&
  23.                 0x80 == (*(in +1) & 0xc0) &&
  24.                 0x80 == (*(in + 2) & 0xc0)) {
  25.             /* 3bytes UTF-8 Charater.*/
  26.             temp1 = (UINT16)(*(in++) & 0x0f);
  27.             temp1 <<= 12;
  28.             temp2 = (UINT16)(*(in++) & 0x3F);
  29.             temp2 <<= 6;
  30.             temp1 = temp1 | temp2 | (UINT16)(*(in++) & 0x3F);
  31.             *out = temp1;
  32.         }
  33.         else {
  34.         /* unrecognize byte. */
  35.             return -1;
  36.         }
  37.         *out++;
  38.         i++;
  39.     }
  40.     return i;
  41. }

阅读(2578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~