包含BOM的UTF-8 HTML和CSS文件(以及如何使用Python删除BOM)

Cam*_*ron 12 python byte-order-mark file utf-8

首先,一些背景:我正在使用Python开发Web应用程序.我的所有(文本)文件当前都以带有BOM的UTF-8存储.这包括我的所有HTML模板和CSS文件.这些资源作为二进制数据(BOM和所有)存储在我的数据库中.

当我从数据库中检索模板时,我使用它来解码它们template.decode('utf-8').当HTML到达浏览器时,BOM存在于HTTP响应主体的开头.这会在Chrome中产生一个非常有趣的错误:

Extra <html> encountered. Migrating attributes back to the original <html> element and ignoring the tag.

Chrome似乎会<html>在看到BOM时自动生成代码并将其误认为内容,从而使真正的<html>代码出错.

那么,使用Python,从我的UTF-8编码模板中删除BOM的最佳方法是什么(如果存在 - 我将来不能保证这一点)?

对于其他基于文本的文件,如CSS,主流浏览器是否会正确解释(或忽略)BOM?它们作为普通二进制数据发送而没有.decode('utf-8').

注意:我使用的是Python 2.5.

谢谢!

Mar*_*nen 23

既然你说:

我的所有(文本)文件当前都以带有BOM的UTF-8存储

然后使用'utf-8-sig'编解码器对它们进行解码:

>>> s = u'Hello, world!'.encode('utf-8-sig')
>>> s
'\xef\xbb\xbfHello, world!'
>>> s.decode('utf-8-sig')
u'Hello, world!'
Run Code Online (Sandbox Code Playgroud)

它会自动删除预期的BOM,并且如果BOM不存在也能正常工作.


Ign*_*ams 10

解码后检查第一个字符,看它是否是BOM:

if u.startswith(u'\ufeff'):
  u = u[1:]
Run Code Online (Sandbox Code Playgroud)

  • @John:打电话让数字混在一起"完全错误"只是略显戏剧性的,你不觉得吗? (3认同)