Есть ли способ обойти проблемы с юникодом при использовании модулей win32api / com в python 3? - PullRequest
0 голосов
/ 22 января 2019

Я посмотрел вокруг и пока ничего не нашел. Я просматриваю электронные письма в почтовом ящике и проверяю определенный набор слов. Это работает на большинстве электронных писем, но некоторые из них не анализируются. Я проверил сломанные письма, используя.

print (msg.Body.encode('utf8'))

и мои сообщения о проблемах начинаются с b '. как это

b'\xe6\xa0\xbc\xe6\xb5\xb4\xe3\xb9\xac\xe6\xa0\xbc\xe6\x85\xa5\xe3\xb9\xa4\xe0\xa8\x8d\xe6\xb4\xbc\xe7\x91\xa5\xe2\x81\xa1\xe7\x91\x

Я думаю, что это заставляет python читать тело как байты, но я не уверен. В любом случае после b, независимо от того, какую кодировку я пробую, я не получаю ничего, кроме мусорного текста.

Я уже пробовал другие методы кодирования, а также декодирование, но я просто получаю массу ошибок атрибутов.

import win32api
import win32com.client
import datetime
import os
import time


outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
dater = datetime.date.today() - datetime.timedelta(days = 1)
dater = str(dater.strftime("%m-%d-%Y")) 
print (dater)
#for folders in outlook.folders:
#    print(folders)

Receipt = outlook.folders[8]

print(Receipt)

Ritems = Receipt.folders["Inbox"]

Rmessage = Ritems.items

for msg in Rmessage:
    if (msg.Class == 46 and msg.CreationTime.strftime("%m-%d-%Y") == dater):
        print (msg.CreationTime)
        print (msg.Subject)
        print (msg.Body.encode('utf8'))

        print ('..............................')

Конечный результат - распечатать сообщение в консоли или, по крайней мере, дать Python способ прочитать его, чтобы я мог найти искомый текст в теле.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Как сказал Мартино, правильная кодировка, которую я искал, была utf16.Другие сообщения были закодированы с использованием utf8.Так что простой анализ почты оказался отличным уроком по кодированию, а также классов сообщений (не по теме).Спасибо за помощь.

0 голосов
/ 22 января 2019

Литерал байта, указанный в вопросе, действителен в формате UTF-8. Первые два символа - U + 683C и U + 6D74 из блока унифицированных идеографов CJK, U + 4E00 - U + 9FFF.

Поскольку вы не знаете исходную кодировку, невозможно быть в этом полностью уверенным, но есть вероятность, что тело письма - это просто символы Хана, закодированные в UTF-8 ( Определите кодировку текста в Python ). Если вы не можете видеть символы UTF-8 правильно, проверьте свой терминал или набор символов.

Тем не менее, вы должны правильно понять основы представления символов. Случайное кодирование или декодирование вряд ли что-то решит. Я бы посоветовал вам начать с чтения Спольского введения в Unicode, а затем перейти к Batchelder на Unicode в Python.

...