2010-03-30 3 views
0

В настоящее время я работаю над боттом irc для многоязычного канала, и я сталкиваюсь с некоторыми проблемами с unicode, которые практически невозможно решить.Проблемы с юникодом Python (2.6)

Независимо от того, какую конфигурацию кодировки в кодировке Юникода я стараюсь, функция списка, которая находится ниже в коде, просто ничего не делает (c.notice - это функция класса, которая отправляет команду NOTICE на сервер irc) или когда он что-то делает, выплевывает что-то, что явно не закодировано.

Команда должна посылать 天子, но вместо этого она кажется hellbent при отправке å¤ © å с предыдущей конфигурацией тех же команд. Тот, который я указал ниже, относится к разновидности «отправить ничего». Я не работал с unicode до этого, и поэтому я довольно застрял. Я также уверен, что я делаю это совершенно неправильно, как следствие.

(compileCMD просто принимает список и выкладывает одну строку из всех элементов в списке)

uk = self.compileCMD(self.faq.keys(),0) 
ukeys = unicode(uk,"utf-8").encode("utf-8") 
c.notice(nick, u"Current list of faq entries: %s" % (uk)) 
+0

Как c.notice осуществляет свою деятельность? Я предполагаю, что последняя строка должна быть 'c.notice (nick, u" ...% s "% (ukeys))'. В противном случае этот код Python должен работать - если я не предлагаю взглянуть на то, что происходит в другом месте. Попробуйте сделать 'print' (или' logging.debug() ')' ukeys'. –

ответ

1

Несколько точек:

  • байты «å¤ © å "являются кодировкой UTF-8" 天子 ", так что вы уверены, что это неправильно, что это отправлено? Выполняет ли программа/..., которая должна обрабатывать данные, использовать UTF-8, или просто интерпретирует ввод как другую кодировку, такую ​​как Latin-1?
  • unicode(uk,"utf-8").encode("utf-8"): Декодирование UTF-8, а затем перекодирование как UTF-8 ничего не меняет.
  • ukeys = unicode(uk,"utf-8").encode("utf-8"): Переменная, содержащая повторно зарегистрированные данные, не используется позже.
0

Изменить это:

u"Current list of faq entries: %s" % (uk) 

в этом:

"Current list of faq entries: %s" % (uk) 

и повторите попытку. Убедитесь, что uk уже является кодировкой UTF-8 (не Unicode).

Я предполагаю, что метод c.notice принимает закодированную строку в качестве аргумента, так как ей необходимо отправить закодированную строку по проводу. Если канал является многоязычным, это безопасная ставка, что он ожидает, что он будет закодирован как UTF-8. Также отбросьте бесполезную линию ukeys = unicode(uk,"utf-8").encode("utf-8").

1

Оказывается, проблема была связана с клиентом, который я использовал для тестирования вывода - он не правильно обрабатывал unicode!

+0

Это, скорее всего, потому, что IRC не указывается для использования Unicode (или чего-то еще), а ISO-8859-1 исторически распространен из-за происхождения IRC. – caf

Смежные вопросы