removing BOM prepended by codecs?

Peter Otten __peter__ at web.de
Tue Sep 24 11:59:21 EDT 2013


J. Bagg wrote:

> I've checked the original files using od and they don't have BOMs.
> 
> I'll remove them in the servlet. The overhead is probably small enough
> unless somebody is doing a massive search. We have a limit anyway to
> prevent somebody stealing the entire set of data.
> 
> I started writing the Python search because the ancient C search had
> started putting out BOMs. I'm actually mystified because our home Linux
> box does not add BOMs even though it runs 2.7 but my work one does even
> though it has the same version. The only difference is Fedora 18 v
> Fedora 17.
> 
> The BOMs are certainly there:
> 
> <86> <AD><FB>%R 10C0203z-621
> %A François-Xavier Le_Bourdonnec
> 
> 0000000 206     255 373   %   R       1   0   C   0   2   0   3   z   -
> 
> J
> 

Were these files edited with Notepad? According to

http://docs.python.org/2/library/codecs.html#encodings-and-unicode

"""
To increase the reliability with which a UTF-8 encoding can be detected, 
Microsoft invented a variant of UTF-8 (that Python 2.5 calls "utf-8-sig") 
for its Notepad program: Before any of the Unicode characters is written to 
the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: 
0xef, 0xbb, 0xbf) is written.
"""

To strip off such a UTF-8 encoded BOM you can open the source file with 
"utf-8-sig" and write the output to a (different!) file with "utf-8"

with codecs.open(source, "r", encoding="utf-8-sig") as instream:
    with codecs.open(dest, "w", encoding="utf-8") as outstream:
        shutil.copyfileobj(instream, outstream)




More information about the Python-list mailing list