Guessing the encoding from a BOM
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Thu Jan 16 20:18:39 EST 2014
On Thu, 16 Jan 2014 11:37:29 -0800, Albert-Jan Roskam wrote:
> -------------------------------------------- On Thu, 1/16/14, Chris
> Angelico <rosuav at gmail.com> wrote:
>
> Subject: Re: Guessing the encoding from a BOM To:
> Cc: "python-list at python.org" <python-list at python.org> Date: Thursday,
> January 16, 2014, 7:06 PM
>
> On Fri, Jan 17, 2014 at 5:01 AM,
> Björn Lindqvist <bjourne at gmail.com>
> wrote:
> > 2014/1/16 Steven D'Aprano <steve+comp.lang.python at pearwood.info>:
> >> def guess_encoding_from_bom(filename, default):
> >> with open(filename, 'rb')
> as f:
> >> sig =
> f.read(4)
> >> if
> sig.startswith((b'\xFE\xFF', b'\xFF\xFE')):
> >> return
> 'utf_16'
> >> elif
> sig.startswith((b'\x00\x00\xFE\xFF', b'\xFF\xFE\x00\x00')):
> >> return
> 'utf_32'
> >> else:
> >> return
> default
> >
> > You might want to add the utf8 bom too:
> '\xEF\xBB\xBF'.
>
> I'd actually rather not. It would tempt people to pollute UTF-8 files
> with a BOM, which is not necessary unless you are MS Notepad.
>
>
> ===> Can you elaborate on that? Unless your utf-8 files will only
> contain ascii characters I do not understand why you would not want a
> bom utf-8.
Because the UTF-8 signature -- it's not actually a Byte Order Mark -- is
not really necessary. Unlike UTF-16 and UTF-32, there is no platform
dependent ambiguity between Big Endian and Little Endian systems, so the
UTF-8 stream of bytes is identical no matter what platform you are on.
If the UTF-8 signature was just unnecessary, it wouldn't be too bad, but
it's actually harmful. Pure-ASCII text encoded as UTF-8 is still pure
ASCII, and so backwards compatible with old software that assumes ASCII.
But the same pure-ASCII text encoded as UTF-8 with a signature looks like
a binary file.
> Btw, isn't "read_encoding_from_bom" a better function name than
> "guess_encoding_from_bom"? I thought the point of BOMs was that there
> would be no more need to guess?
Of course it's a guess. If you see a file that starts with 0000FFFE, is
that a UTF-32 text file, or a binary file that happens to start with two
nulls followed by FFFE?
--
Steven
More information about the Python-list
mailing list