Unicode编码Linux下的转换
最近得到一份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?