utf-16和unicode区别

转:http://blog.sina.com.cn/s/blog_4d25c9870100epc1.html


Unicode转UTF-16

一.UTF-16

     
UTF-16是Unicode的其中一个使用方式。 UTF是 Unicode/UCS Transformation Format,即把Unicode转做某种格式的意思。但是万万不要说UTF-16编码就是Unicode,这是不对的,因为Unicode他是由2个byte组成的,但是大多数UTF-16也是2个byte组成的,也有4个byte组成的,如:中国文字大部份是两字节,有的是四字节(很多人可能没见过,方正楷体S-超大字符集(SIP)这个字体里面存放的都是四字节的字模,可以从http://wyx.nbtvu.net.cn/jmm/Computing/indexComputing.htm下载相关字体)。

二. UTF-16编码

1.Unicode值小于0x10000的用等于该值的16位整数来表示。
2.Unicode值介于0x10000和0x10FFFF之间的,用一个值介于0xD800和0xDBFF(在所谓的高8位区)的16位整数和值介于0xDC00和0xDFFF(在所谓的低8位区)的16位整数来表示。
3.Unicode值大于0x10FFFF不能按照UTF-16进行编码。
                                                    

16进制编码范围

UTF-16表示方法(二进制)

10进制码范围

字节数量

0000 0000---0000 FFFF

xxxxxxxx xxxxxxxx

0-65535

2

0001 0000---0010 FFFF

110110yyyyyyyyyy110111xxxxxxxxxx

65536-1114111

4


注意:在0xD800和0xDFFF间的值是特别为UTF-16预留,所以不应该将任何字符的值指定为这个区间内的数值.UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节(2字节)储存,但UTF-16却无法相容于ASCII编码。

三.Unicode转UTF-16

将某个字符的Unicode值转换为UTF-16的编码按照以下步骤进行。假设U是给Unicode值,小于x10FFFF。
1) 如果U < 0x10000,U的编码就是无符号的十六位整数,值和其本身的值一样,处理结束。
2) 如果U等于或者小于0x10FFFF,则设U' = U - 0x10000。此时,U'一定小于或者等于0xFFFFF,也就是说,U'的值不会超过20位。
3) 分别初始化2个16位无符号的整数,W1和W2为0xD800和0xDC00。每个整数都有10位可以用来对字符进行编码,正好能容纳U'的20位。
4) 将U'的高10位分配给W1的低10位,将U'的低10位分配给W2的低10位,处理结束。
用数字来表示,第2步到第4步如下所示:
 U' = yyyyyyyyyyxxxxxxxxxx
 W1 = 110110yyyyyyyyyy
 W2 = 110111xxxxxxxxxx


四.Code

下面的code是简单的实现一个Unicode转成UTF-16的功能。没有实现一批批字符的转,把这段code改进一下就可以了。
//-------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main()
{
     FILE *out ;
     long unicode = 74565;  //在这里只拿一个值做个演示0x12345    
     //U+12345表示为 D8 08 DF 45(UTF-16BE),或者08 D8 45 DF(UTF-16LE)。
     long h , l ;
     out = fopen("out.txt","wb");
     fputwc(L'\xFEFF', out);
     if (unicode < 0 || unicode >0x10ffff)
     {
         printf("error!");
     }
     else
     {
         if (unicode <0x10000)
         {
              fwprintf(out,L"%c", unicode);
         }
         else
         {
              unicode = unicode - 0x10000 ;
              long vh = (unicode & 0xFFC00) >> 10 ;
              long vl =  unicode & 0x3ff;
              h =  0xD800 | vh;
              l =  0xDC00 | vl;
              fwprintf(out,L"%c",h);
                fwprintf(out,L"%c",l);
         }
     }
}

//-------------------------------------------------------
五.怎麼在Windows上得到一個UTF-16的文本文件

          Windows上的记事本,只有这Unicode格式的,ANSI格式,Unicode big endian格式,UTF-8格式,如下图:
                          Unicode转UTF-16

 

我怎么能得到一个UTF-16的记事本文件,很简单。用UE来实现吧。用UE打开一个记事本文件,Sava As,就会有很多编码格式让你选择。这里就有UTF-16的几种格式。但是你用记事本另存为,看这个文件的编码的时候,你发现Unicode,其实有一种说法不是很合理就是,在Windows上UTF-16就是Unicode,其实这种说法不合理,但是这样是能在Windows上建立一个UTF-16格式的文件。

       Unicode转UTF-16

六.參考鏈結

http://zh.wikipedia.org/wiki/UTF-16
http://stallman.blogbus.com/logs/41709878.html


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值