昨天,今天,明天,每天的每天,你是否都多懂得一点点...

星期六, 四月 25, 2009

TIDY在VIM中处理UTF-8的问题

如果文件格式是UTF-8的话,用TIDY查错就会有大问题, 每个中文都是一个错误
replacing invalid character code

因为TIDY处理的其实是文件,所以这只能FENC有关,和ENC无关. 只有把FENC换回CP936才能正常.
本来想把文件全部换成 UTF-8的,看来不用了...而则之前用VIM把所有文件转换成UTF-8后, 网页显示有点不正常. 后来下了个VBS写的小程序来转,转换速度飞快, 但是转完后网页打开一片混乱.我怀疑它只是在文件头部插入了UTF-8的标识而已.
于是, 做一番研究
41 C4 E3 41 A你A ANSI

打开VIM后,set fenc 查一下,是cp936
OK
现在set fenc=utf-8 转成 utf-8, 保存

41 E4 BD A0 41 0D A你A UTF-8

0D是被VIM加入的回车符,应该是 0D 0A 才对好像,查了一下, ff 被设成 mac 了,晕, 设回DOS,再保存看看.

41 E4 BD A0 41 0D 0A 

这回没错了, 说明了"你"的 cp936 编码是 C4 E3, 而在UTF-8里则是 E4 BD A0, 字母A的编码是41, CP936和UTF-8都没有区别.

用VIM设回CP936,

41 C4 E3 41 0D 0A

变成这样, 比第一行多了回车和换行符.

用记事本另存为UTF-8后, 变成

EF BB BF 41 E4 BD A0 41 0D 0A

就是在前面插入了 EF BB BF, 而VIM在转换成UTF-8的时候, 并不会这么做.

用VIM打开这个文件, 显示正常. 用VIM加入字母B后, 保存, VIM不会移除原有的 EF BB BF

EF BB BF 42 41 E4 BD A0 41 42 0D 0A BA你AB

用记事本再另存为ANSI, EF BB BF被移除. 
42 41 C4 E3 41 42 0D 0A 

再用记事本存回UTF8
EF BB BF 42 41 E4 BD A0 41 42 0D 0A

用VIM set fenc=cp936 

42 41 C4 E3 41 42 0D 0A

和记事本另存为ANSI效果一样.

再 set fenc=utf-8 
EF BB BF 42 41 E4 BD A0 41 42 0D 0A

晕, 这回它懂得加 EF BB BF 了....

设回 CP936, 关掉VIM中文件,再打开, 设为 UTF-8

42 41 E4 BD A0 41 42 0D 0A 

不会加了...

看来VIM在一般情况下, 存为UTF-8格式并不会在文件头插入 EF BB BF 的标识.

于是把文件在记事本中另存一下, 让它插入 EF BB BF标识为UTF-8文件, 在VIM中打开TIDY, comp! tidy, 然后MAKE一下, 成功了,可以正常MAKE UTF-8的格式. 但TIDY显示这么一行

specified input encoding (iso-8859-1) does not match actual input encoding (utf-8)


说明TIDY这回认出了文件是UTF-8了. 而VIM中TIDY的MAKE中没有加了 -UTF8 的参数,所以它是按默认 iso-8859-1 来处理文件的, 这就是为什么会把所有中文当作错误的原因.

上网查了一下, 这三个字节 EF BB BF 叫UTF-8 BOM HEADER, 但好像我用的ASP服务器不能正确处理这个BOM HEADER. 这些再研究吧...

想想怎么让VIM在转 UTF-8的时候, 也自动加入BOM头...


--
Feng

没有评论:

其它博客地址

此博客的同步博客地址: http://fengnz.wordpress.com
这里进入我的MSN SPACE.