今天写了一个Python读取CSV文件的程序。自己测试完全没有问题,给同事去用却没能正确处理文件的内容。同事用Excel打开CSV查了好半天,然后把问题打回给我。
读取了该文件的内容一查,果然这是一个BOM文件。BOM
:是Byte Order Mark的缩写。这是一个多字节的Unicode字符(Unicode有多种标准,有些标准里一个字符的长度是不固定的),这个字符用来指明:
- 该字节流使用了Unicode
- 这个字节流使用的Unicode编码是什么
- 这个字节流在传输中用的字节序(大小头)是什么
Unicode编码 | BOM(十六进制) | BOM(十进制) |
---|---|---|
UTF-8 | EF BB BF | 239 187 191 |
UTF-16 (BE) | FE FF | 254 255 |
UTF-16 (LE) | FF FE | 255 254 |
UTF-32 (BE) | 00 00 FE FF | 0 0 254 255 |
UTF-32 (LE) | FF FE 00 00 | 255 254 0 0 |
UTF-7 | 2B 2F 76 | 43 47 118 |
UTF-1 | F7 64 4C | 247 100 76 |
UTF-EBCDIC | DD 73 66 73 | 221 115 102 115 |
SCSU | 0E FE FF | 14 254 255 |
BOCU-1 | FB EE 28 | 251 238 40 |
GB18030 | 84 31 95 33 | 132 49 149 51 |
BOM
在Unicode文件中是可选的,而且在很多系统中是不建议的。文本处理程序在按照字节读取文件内容的时候如果没有正确处理BOM
就会产生错误。另外,BOM
在某些编辑器中是不可见的(如Windows的记事本),因此你可能在查找问题的时候还看不到它。
还遇到过的一个问题:在文本文件的拼接和嵌入时没有处理好BOM
,造成了拼接后的文件中间(不是文件开头)出现了异常字符,影响了显示结果。
如过你处理的文本来自不同的系统,请注意编码问题和BOM
字符的过滤。