Задать вопрос
Karde
@Karde
Ph.D. student at the GWU & CBI

Python + кириллица?

Ситуация: есть консольное приложение на Python (версия 2.7). В ходе работы приложение должно выводить (считывать не нужно, уж не знаю, важно ли это) данные в консоль, в том числе текст на русском языке. Проблема

def __str__(self):
        return "%s |(%s)|"  % (self.name, self.id)



вот self.name — строка, в которой могут быть русские символы.

Без каких либо преобразований вообще — вылетает ошибка:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)



Если же заменить код на:

def __str__(self):
        return "%s |(%s)|"  % (repr(self.name.encode("UTF-8")), self.id)



то исключение не вылетает, но на консоль выводятся не кириллические символы, а их байтовая репрезентация.

Пример:

'\xd0\x95\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb0 S.' |(157927927)|


Вместо:

Елена S.


Как решать такую проблему? С латиницей проблем нет, тот же код выводит не байтовую репрезентацию, а нормальные латинские символы символы.

Что кстати можно почитать по этому поводу?
  • Вопрос задан
  • 95494 просмотра
Подписаться 8 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@shsmad
#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Foo(object):
    def __init__(self, name):
	self.name = name
	
    def __str__(self):
	return 'str: %s' % self.name
	
    def __unicode__(self):
        return 'uni: %s' % self.name.decode('utf-8')

    def __repr__(self):
	return 'repr: %s' % self.name

a = 'Елена S'
b = Foo(a)

print(str(b))
print(unicode(b))
print(repr(b))


Выводит:
str: Елена S
uni: Елена S
repr: Елена S
Ответ написан
@Norkotik
а если a = u'Елена S'?
Ответ написан
Комментировать
@Quis_sum_ego
пуританец
Дорогой автор !
я долго размышлял в чём дело!
пока не прочел вашу статью
versin python 2
-*- coding: utf-8 -*-
слово="слова"
print 'слово'
увы он не поддерживал модулей поддержки языков !

а проблема моя была в том что работая с программой eclipse mars все слова выводимые программой он судорожно показывал обнародовал как ошибка и выдавал № код ячейки памяти в котором хранился этот непонятный интерпритатору обьект .
помогло вот что!
sudo apt-get install python 3
и естественно смена компилятора python 2 на более позднюю версию !
Ответ написан
Комментировать
@toga
Вдруг кому пригодится - для того чтобы pyton2 не ругался нужно в начале класса прописать
@python_2_unicode_compatible
class AuthorModel(models.Model):
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы