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)