ITPub博客

首页 > Linux操作系统 > Linux操作系统 > BOM

BOM

原创 Linux操作系统 作者:redhouser 时间:2012-07-10 10:20:37 0 删除 编辑

1,什么是BOM?
BOM: Byte Order Mark
UTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,是为了支持UTF-16,UTF-32才加上的

BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。

Byte Order Marks are special characters at the beginning of a Unicode file to indicate whether it is big or little endian, in other words does the high or low order byte come first. These codes also tell whether the encoding is 8, 16 or 32 bit. You can recognise Unicode files by their starting byte order marks, and by the way Unicode-16 files are half zeroes and Unicode-32 files are three-quarters zeros. Unicode Endian Markers

Byte-order mark Description
EF BB BF UTF-8
FF FE UTF-16 aka UCS-2, little endian
FE FF UTF-16 aka UCS-2, big endian
00 00 FF FE UTF-32 aka UCS-4, little endian.
00 00 FE FF UTF-32 aka UCS-4, big-endian.

UTF的字节序和BOM
UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

原来BOM是在文件的开始加了几个字节作为标记。有了这个标记,一些协议和系统才能识别。

ok,说了这么多背景,那么如何解决这个问题呢?

2,查看文件
在Windowsxp上使用EditPlus新建文件,输入abc,分别存为不同编码。
a.txt ANSI
a_unicode_be.txt unicode_big_endian
a_unicode_be.txt unicode
a_utf8.txt utf8
a_we.txt WestEuropean(Windows)

压缩为zip文件后,ftp到Linux上,解压缩后:
[root@bnet95 bom]# ls -lrt
-rw-r--r-- 1 root root 3 2012-07-04 a.txt
-rw-r--r-- 1 root root 8 2012-07-04 a_unicode.txt
-rw-r--r-- 1 root root 8 2012-07-04 a_unicode_be.txt
-rw-r--r-- 1 root root 3 2012-07-04 a_utf8.txt
-rw-r--r-- 1 root root 3 2012-07-04 a_we.txt

Linux为LittleEndian。

2.1 hexdump

[root@bnet95 bom]# hexdump -C a.txt
00000000  61 62 63                                          |abc|
00000003
[root@bnet95 bom]# hexdump -C a_unicode.txt
00000000  ff fe 61 00 62 00 63 00                           |..a.b.c.|
00000008
[root@bnet95 bom]# hexdump -C a_unicode_be.txt
00000000  fe ff 00 61 00 62 00 63                           |...a.b.c|
00000008
[root@bnet95 bom]# hexdump -C a_unicode_utf8.txt
hexdump: a_unicode_utf8.txt: 娌℃湁閭d釜鏂囦欢鎴栫洰褰?
hexdump: a_unicode_utf8.txt: 閿欒?鐨勬枃浠舵弿杩扮?
[root@bnet95 bom]# hexdump -C a_we.txt
00000000  61 62 63                                          |abc|
00000003

2.2 xdd

[root@bnet95 bom]# xxd a.txt
0000000: 6162 63                                  abc
[root@bnet95 bom]# xxd a_unicode.txt
0000000: fffe 6100 6200 6300                      ..a.b.c.
[root@bnet95 bom]# xxd a_unicode_be.txt
0000000: feff 0061 0062 0063                      ...a.b.c
[root@bnet95 bom]# xxd a_utf8.txt
0000000: 6162 63                                  abc
[root@bnet95 bom]# xxd a_we.txt
0000000: 6162 63                                  abc

2.3 od

[root@bnet95 bom]# od -t x2 a.txt
0000000 6261 0063
0000003
[root@bnet95 bom]# od -t x2 a_unicode.txt
0000000 feff 0061 0062 0063
0000010
[root@bnet95 bom]# od -t x2 a_unicode_be.txt
0000000 fffe 6100 6200 6300
0000010
[root@bnet95 bom]# od -t x2  a_utf8.txt
0000000 6261 0063
0000003
[root@bnet95 bom]# od -t x2  a_we.txt
0000000 6261 0063
0000003
注意:与2.2中字节序不同,哪个为准?

3 修改

xxd - make a hexdump or do the reverse.
  能够显示文件对应的十六机制格式,同时还能将修还后的十六进制格式反写回文件,一般与vim结合使用。(利用vim的:! 参数执行外部命令)
使用过程如下:
(1)用vim打开要查看文件
    vim txtfile
(2)在vim命令模式下输入
  :% !xxd
  解释: %表示文件的所有行,!xxd表示执行外部命令xxd,结合在一起,就是把当前vim上显示的所有行传递给xxd,xxd把处理后的结果重新显示在vim上。
  结果如图所示
 

(3)这时候可以直接在上面修改十六进制值。注意:当前修改了十六进制值,右边侧栏的ASCII码并不会相应改变。
(4)修改完毕后,反写回原文件。在vim命令模式下输入
 :% !xxd -r
  只有十六进制的修改部分才会被采用,右边侧栏的ASCII码值忽略不管。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18922393/viewspace-735042/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-05-26

  • 博文量
    211
  • 访问量
    804603