Найти - Пользователи
Полная версия: Кодировка сообщени
Начало » Python для новичков » Кодировка сообщени
1 2 3
pablodiguerero
Забираю сообщения через IMAPClient в несколько потоков. Кодировка терминала utf-8, в основном
приложении utf-8, в потоке utf-8. Сообщения возвращаются в koi8-r. Как привести сообщения в utf-8, чтобы их текст корректно отображался в терминале?
Budulianin
pablodiguerero
Как привести сообщения в utf-8,
Когда получил сообщение, переводи в Unicode, дальше можешь перевести во что угодно или так оставить.
pablodiguerero
unicode(part.get_payload(decode=True), ‘koi8-r’) на выводе - что-то вроде
ц░б╫ц░б╣ ц▒б│ц░б╨ц░б╟ц░б╥ц░б╟ц░б╩,
pablodiguerero
все, у меня наипело… Вот чего я не понимаю? У меня есть строка “строка1”, она в koi8-r. Чтобы она стала utf8 нужно

Способ 1. unicode(str1, “koi8-r”).encode(“utf8”)
Способ 2. str.decode(“koi8-r”).encode(“utf8”)

Что тут не так?
Singularity
koir_string = 'sdfsf'
unicode_string = koir_string.decode('koi8-r') 
utf8_string = unicode_string.encode('utf-8')


Budulianin
pablodiguerero
Что тут не так?

Тут всё так, а что ты делаешь с сообщениями, неизвестно.
pablodiguerero
return self.imap_con.fetch(messages, ['RFC822'])
for msgid, data in messages.iteritems():
message = email.message_from_string(data['RFC822'])
for part in message.walk():
#~ ---
elif part.get_content_type() == "text/plain":
 if body is None:
   body = ""
  body += unicode(part.get_payload(decode=True), enc, 'replace').encode('utf8','replace')
elif part.get_content_type() == "text/html":
 if html is None:
  html = ""
  html += unicode(part.get_payload(decode=True), enc, 'replace').encode('utf8','replace')
open(('/tmp/%d.log') % (msgid), 'w').write("%s\n" % data['html'])

Посмотрите пожалуйста свежим взглядом, тут все нормально?
Singularity
pablodiguerero
тут ничего не понятно и отступы потерялись.
pablodiguerero
смысл кода вот такой:
def exmaple():
	self.imap_con = IMAPClient(self.options['server'], self.options['port'], True, self.options['use_ssl'])
	self.imap_con.login(self.options['login'], self.options['password'])
	
	self.imap_con.select_folder(unicode(folder, 'utf-8'))
	messages = self.imap_con.search(('UID %d:%d')%(mfrom, mto))
	messages = self.imap_con.fetch(messages, ['RFC822'])
		
	for message in messages:
		body = ""
		html = ""
		for part in message.walk():
			if part.get_content_type() == "text/plain":
				body += unicode(part.get_payload(decode=True), enc, 'replace').encode('utf8','replace')
			elif part.get_content_type() == "text/html":
				html += unicode(part.get_payload(decode=True), enc, 'replace').encode('utf8','replace')
pablodiguerero
В общем прошу простить меня за излишнюю эмоциональность, сегодня ночью начал подбираться к суте проблемы. Вот что нашел:

Код примера:

connect = IMAPClient("imap.yandex.com", 993, True, True)
connect.login("bitrix@sipg.ru", "+++")
connect.select_folder("INBOX")
messages = connect.search(('UID %d:%d')%(1,10))
messages = connect.fetch(messages, ['RFC822'])
for uid, data in messages.iteritems():
	msg = email.message_from_string(data['RFC822'].encode('utf8'))
	for part in msg.walk():
		if part.get_content_type() == "text/html":
			text = part.get_payload()
			print text

Вывод получается вот такой:
<table><tr>
<td style='padding: 5px;'><strong>ТекÑÑ Ð·Ð°Ñвки</strong></td>
<td style='padding: 5px;'>ÐÐ¾Ð¼ÐµÑ Ð·Ð°Ñвки: 5
ÐÐ¾Ð¼ÐµÑ ÐºÐ²Ð°ÑÑиÑÑ: 66
ÐÐ¾Ð¼ÐµÑ Ð¿Ð¾Ð´Ñезда: 2
ЭÑаж: 2
СÑоимоÑÑÑ:
</td>
</tr><tr>
<td style='padding: 5px;'><strong>ФÐÐ</strong></td>
<td style='padding: 5px;'>yuhj</td>
</tr><tr>
<td style='padding: 5px;'><strong>ЭлекÑÑÐ¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑÑа</strong></td>
<td style='padding: 5px;'>jhg</td>
</tr><tr>
<td style='padding: 5px;'><strong>ТелеÑон</strong></td>
<td style='padding: 5px;'>jhg</td>
</tr></table>

Но если сразу после строчки for uid, data in messages.iteritems(): вывести data, то увидим вот такой вот текст:

<table><tr>\r\n\t\t\t<td style='padding: 5px;'><strong>\xd0\xa2\xd0\xb5\xd0\xba\xd1\x81\xd1\x82 \xd0\xb7\xd0\xb0\xd1\x8f\xd0\xb2\xd0\xba\xd0\xb8</strong></td>\r\n\t\t\t<td style='padding: 5px;'>\xd0\x9d\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80 \xd0\xb7\xd0\xb0\xd1\x8f\xd0\xb2\xd0\xba\xd0\xb8: 5\r\n\xd0\x9d\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80 \xd0\xba\xd0\xb2\xd0\xb0\xd1\x80\xd1\x82\xd0\xb8\xd1\x80\xd1\x8b: 66\r\n\xd0\x9d\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80 \xd0\xbf\xd0\xbe\xd0\xb4\xd1\x8c\xd0\xb5\xd0\xb7\xd0\xb4\xd0\xb0: 2\r\n\xd0\xad\xd1\x82\xd0\xb0\xd0\xb6: 2\r\n\xd0\xa1\xd1\x82\xd0\xbe\xd0\xb8\xd0\xbc\xd0\xbe\xd1\x81\xd1\x82\xd1\x8c: \r\n</td>\r\n\t\t</tr><tr>\r\n\t\t\t<td style='padding: 5px;'><strong>\xd0\xa4\xd0\x98\xd0\x9e</strong></td>\r\n\t\t\t<td style='padding: 5px;'>yuhj</td>\r\n\t\t</tr><tr>\r\n\t\t\t<td style='padding: 5px;'><strong>\xd0\xad\xd0\xbb\xd0\xb5\xd0\xba\xd1\x82\xd1\x80\xd0\xbe\xd0\xbd\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xbf\xd0\xbe\xd1\x87\xd1\x82\xd0\xb0</strong></td>\r\n\t\t\t<td style='padding: 5px;'>jhg</td>\r\n\t\t</tr><tr>\r\n\t\t\t<td style='padding: 5px;'><strong>\xd0\xa2\xd0\xb5\xd0\xbb\xd0\xb5\xd1\x84\xd0\xbe\xd0\xbd</strong></td>\r\n\t\t\t<td style='padding: 5px;'>jhg</td>\r\n\t\t</tr></table>\r\n

Если присвоить переменной этот текст, а потом ее вывести, то, о чудо - мы получим нормальный русский язык.

В тоже время если присвоить переменной текст u“тут-был-мой-текст”, то получим иероглифы, которые возвращает исходный код.

Как с этим бороться?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB