Utf和bom的常见问题
- 25. Q:为什么有些人反对UTF-16? A:人们熟悉的可变宽度的东亚字符集,如为Shift - JIS(SJIS),有时需要两个编码单元表示单个字符,可以理解这让人对UTF-16很担心。他们非常熟悉可变宽度编码造成的问题。但是,UTF-16与SJIS中使用的机制有一些很重要的不同: 重叠: 在SJIS中,前导与拖尾编码单元值之间是有重叠的,拖尾与单个编码单元值之间也是。这导致了一些问题: 匹配错误。例如,在拖尾编码单元中查找“a”可能是一个日本文字符。 失去了随机访问的高效。为了知道是否在字符范围内,不得不后向搜索找到边界。 让文本非常脆弱。假如一个单元从前导-拖尾编码单元中丢失,紧随其后的很多字符也随之损坏。 在UTF-16中,高位和低位代理编码点范围和单个编码单元一样都是完全不相交的。下面的问题都不会产生: 匹配错误。There are no false matches. 从每个编码单元值中,字符边界位置能直接确定。 丢失代理编码仅导致单个字符损坏。 频率: 绝大多数SJIS字符需要2个编码单元,但是单个编码单元的字符非常常见并尤其重要,例如文件名。 用UTF-16,相对较少的字符需要2个编码单元。绝大多数常见的字符是单个编码单元的。甚至在东亚字文字中,病态代理对几率应该在文本存储平均值的1%以下。当然,某些文档可能病态代理对的几率较高,就像“phthisique ”尽管在英文中的频率不高,但在特殊的学术文章中经常出现的一样。 25
- 46. Q:应该如何处理BOM? A:以下有几条建议: 一个特定的协议(例如,微软惯用的.txt文件)可能要求在数据流上(如文件),使用BOM。当需要去遵循这样的协议时使用BOM。 有些协议在未标记文本的情况下允许BOM是可选的。这些情况, 已经知道文本数据流是纯文本,但不知道编码形式,BOM可以用作签名。如无BOM,编码形式可能是任意的。 已经知道文本数据流是纯Unicode文本,但不知道字节序,BOM可以用作签名。如无BOM,文本应该被看作big-endian。 有些面向字节的协议期望在文件开头是ASCII字符。如果这些协议使用UTF-8,那就应该避免使用BOM作为编码形式的签名。 在知道数据流的精确类型的地方(例如,Unicode的big-endian或little-endian),不应该使用BOM。特别地,无论何时数据流申明为UTF-16BE、UTF-16LE、UTF-32BE或者UTF-32LE,禁止使用BOM。 (参看Q:UCS-2与UTF-16之间的区别是什么?) 46