Home

Tags

Python кодировки, подмена stdout

2012-10-30 python кодировки

Иногда в программах появляются проблемы с кодировками, чаще всего это связано с выводом unicode, и вы можете получить ошибку наподобие "UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)". Одно из решений - подменить stdout.
Ниже пример подмены stdout.

# coding: utf8

import sys

class StdOutWrapper(object):
    def __init__(self, active=True):
        self.active = active
        self.std = sys.stdout
        sys.stdout = self
    def write(self, *args):
        if not self.active:
            return
        for i in args:
            if isinstance(i, unicode): i = i.encode('utf8')
            elif not isinstance(i, str): i = repr(i).encode('utf8')
            self.std.write(i)
    def flush(self):
        if not self.active:
            return
        self.std.flush()

def main():
    StdOutWrapper()
    print 'test latin'
    print 'Проверка кириллицы, utf8!!!'
    print u'test latin'
    print u'Проверка кириллицы, unicode!!!'
    print ['Про', u'верка!']

if __name__ == '__main__':
    main()