What is file.encoding convention?
Naoki INADA
songofacandy at gmail.com
Wed Jul 22 23:06:56 EDT 2009
In document <http://docs.python.org/library/
stdtypes.html#file.encoding>:
>> The encoding that this file uses. When Unicode strings are written to a file,
>> they will be converted to byte strings using this encoding. In addition,
>> when the file is connected to a terminal, the attribute gives the encoding
>> that the terminal is likely to use
But in logging.StreamHandler.emit() ::
try:
if (isinstance(msg, unicode) and
getattr(stream, 'encoding', None)):
#fs = fs.decode(stream.encoding)
try:
stream.write(fs % msg)
except UnicodeEncodeError:
#Printing to terminals sometimes fails.
For example,
#with an encoding of 'cp1251', the above
write will
#work if written to a stream opened or
wrapped by
#the codecs module, but fail when writing
to a
#terminal even when the codepage is set to
cp1251.
#An extra encoding step seems to be
needed.
stream.write((fs % msg).encode
(stream.encoding))
else:
stream.write(fs % msg)
except UnicodeError:
stream.write(fs % msg.encode("UTF-8"))
And behavior of sys.stdout in Windows::
>>> import sys
>>> sys.stdout.encoding
'cp932'
>>> u = u"あいう"
>>> u
u'\u3042\u3044\u3046'
>>> print >>sys.stdout, u
あいう
>>> sys.stderr.write(u)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position
0-2: ordinal not in range(128)
What is file.encoding convention?
If I want to write a unicode string to a file(-like) that have
encoding attribute, I should do
(1) try: file.write(unicode_str),
(2) except UnicodeEncodeError: file.write(unicode_str.encode
(file.encoding))
like logging?
It seems agly.
More information about the Python-list
mailing list