Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155115
  • 博文数量: 19
  • 博客积分: 901
  • 博客等级: 准尉
  • 技术积分: 268
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-14 23:58
文章分类

全部博文(19)

文章存档

2010年(19)

我的朋友

分类: LINUX

2010-05-31 12:06:16

以上四个工具对UTF-8 的支持不相同,曾经有过开发部门禁止使用editplus 来编辑UTF-8 文件。下面是四个工具对UTF-8支持情况:
注:UTF-8 BOM header: 是三个字符: EF BB BF。
1. notepad
notepad 在保存时,选择UTF-8 格式,会在文件头写上BOM header.
2. editplus
文件保存时,选择UTF-8 格式,不会在文件头写上 BOM header.
3. ultraedit
ultraedit 对UTF-8 的支持最为完备。在advanced->configuration中可以选择文件保存时是否写上BOM header.
4. vi
指的是Linux 下的vim, 如果UTF-8 文件开头有BOM header, 其能够正常显示UTF-8 编码,否则,显示为乱码。
还有一些编码转换工具,比如,可以用java 写一个简单的编码转换工具,这些工具是不会增加BOM header的。

UltraEdit 对UTF-8文件的自动处理
关于Unicode 编码,Unicode是几种多字节编码格式的统称,其中使用广泛的有UTF-8与UTF-16,而通常人们说Unicode时,实际是在指UTF-16编 码,UltraEdit 就是这样。
使用UltraEdit 打开一个UTF-8 编码的文件,然后按ctrl+h 进入16进制模式查看文件内码,你会发现文件已经被转换成UTF-16 编码,并添加了UTF-16 little endian的BOM :FF FE,UltraEdit 状态栏文件的尺寸也增加了不少。其实大可不必担心,可以回到正常模式继续编辑并保存,保存后的文件并没有改变编码格式,只是在编辑时使用UTF-16格式 而已。
因此,如果通过UltraEdit打开文件查看BOM 来确定文件格式,并不是安全的。UltraEdit 下方状态栏则真实的显示了当前打开文件的实际编码格式,而不是当前编辑的编码格式。 对于一个普通Ascii 格式的文件,它显示为DOS 或者UNIX,对于一个包含有UTF-8编码字符的文件,它显示为U8-DOS 或者U8-UNIX,对于UTF-16编码的文件,它显示为U-DOS 或者U-UNIX。
我们知道,UTF-8 对于Ascii 字符的编码与原有的Ascii 编码一致,因此假如我们删除了一个UTF-8 DOS文件中所有Ascii 以外的字符,保存后再打开,UltraEdit 将显示为DOS(Ascii)。
如果我们不希望UltraEdit 在打开UTF-8 文件时自动转为UTF-16 格式编辑,我们可以修改配置。如下图,确保“自动检测 UTF-8文件”不被选中。
需要注意的是,如果取消了这个选项,UltraEdit打开包含UTF-8编码的文件会产生乱码。
UltraEdit 在File-Convertions 菜单中提供了多种编码格式之间的转换,这将影响到保存的文件编码,转换后,在状态栏也能看到相应变化。在有些选项后标明有(Unicode Editing) 或者(ASCII Editing),这指定了编辑时显示用的编码,并不影响保存文件所用的编码,要区分开。
工具WinHex 可以用来查看文件16进制内码。

UTF-8文件的Unicode签名BOM(Byte Order Mark)问题

近日在调测一个UTF8编码的中文Zen Cart网站时遇到一件怪事,网页显示文字正常,用ie的察看源文件(记事本打开)却发现乱码,firefox没有这个问题。经在网上多方查证和多次测 试,解决了这个问题,其实是UTF-8文件的Unicode签名BOM(Byte Order Mark)问题。

BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测, 而把它当作正常字符处理。

微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。

也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模 式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。

我找到Zen Cart的模版文件中的html_header.php,发现文件果然不带BOM,用UltraEdit-32另存为的方式加上BOM后,再上传 html_header.php,一切正常。

注意用Convertz把gb2312文件转换成UTF-8文件时,默认设置是不带BOM的。不带BOM可能出现上述乱码问题,但是带 BOM,对于php的include文件要小心,会在php字节流前面多出EF BB BF,提前输出到显示器有可能会带来程序错误。一个解决方案是凡是被include的文件都保存为ANSI,主文件可以是UTF-8。要想把一个文件去掉 BOM,使用UlterEdit打开, 切换到十六进制编辑模式,把最前面三个字节(就是那该死的 EF BB BF)替换为20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了。
阅读(4236) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~