最近得到一份Unicode编码的文件,想转换成utf-8(其实就是想转成非Unicode)。

在网上找了很多文章,有很多人把utf-8理解为unicode,搞得乱哄哄的。请记住,下面的段落是讲如何把 Unicode 编码的文件 转化为 非Unicode的方式。

 

在linux下用iconv命令,

iconv -f ucs-2 -t utf-8 myfile > destfile

搞了半天,发现,Unicode编码(简称为ucs)其实分为

ucs-2be 和ucs-2se   一个是大端法(big-endian),一个是小端法(little-endian),也就是一个码子(2byte)的字节序列不同。windows下是小端法,Linux平台下是大端法.

因此,需要明确指出是那种ucs编码。(比较奇怪的是,这个文件是linux平台产生的,我运行iconv的也是在linux平台,为什么ucs-2不是默认的ucs-2be呢)

iconv -f ucs-2be -t utf-8 myfile > destfile

就好了。

多说一点:

(1)

unicode有2-bytes和4-bytes两种,称为ucs-2和ucs-4.

比如a(ascii码为 0x61),采用usc-2编码,编码成16进制数是  0x0061

小端法(ucs-2le),字节流是   61 00

大端法(ucs-2be),字节流是 00 61

一个只有alphabetic字符的Unicode编码文件,打开后,如果是 00XX 00XX 那么就是大端法(这个从我的文件里也验证了)。

 

(2) utc-xxxx系列编码和unicode

为什么会出现utf-xxx系列呢,utf的意思是 unicode transform format  也就是为了传输unicode而定义的一种编码。不管怎么说,它定义了一种编码方式。一个字符,在utf-xxxx和unicode中有不同的编码方式。同时,可以吧unicode理解为一种解决语言的解决方案,规定了一套映射关系。为了便于使用有定义了utf-xxx系列,utf-xxxx和unicode编码相同的集合,码字不同。

为什么需要unicode的传输模式呢:unicode中的00有可能是正常编码,而非字符串结束标志。很多Linux下的程序,都不支持读unicode(双字节),而是支持multibyte(多字节)编码,那么,00就会被认为是字符串结尾了。

更详细的说明,参见

http://www.cl.cam.ac.uk/~mgk25/unicode.html#history  中的 What is UTF-8?

版权声明:本文为codejumper原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/codejumper/archive/2012/10/11/2718053.html