Я уверен, что на этот вопрос уже был дан ответ, но я понятия не имею, что искать. Моя проблема не столько моя, сколько всех остальных. Короче говоря, у меня есть скрипт на Python с декодированием текста, и он отлично декодирует для меня, но не работает для других пользователей, даже с тем же кодом и вводом.
Я написал скрипт ( источник в Bitbucket ), который преобразует SMS-сообщения Windows Mobile 6 (через вывод PIM Backup ) в SMS-сообщения Android (ввод через SMS Backup & Resotre ) путем преобразования содержимого резервной копии PIM в формат SMSB & R-совместимый XML.
Теперь PIM Backup выводит свое содержимое в формате Little Endian UCS-2, что приятно, поскольку он поддерживает все виды международных разговоров. В моем скрипте я загружаю контент, используя встроенное в Python декодирование строк, и создаю объект для чтения csv с помощью:
# Read the file contents
sms_text = csv_file.read().decode('utf-16').split(os.linesep)
sms_reader = csv.reader(sms_text, delimiter=';', quotechar='"', escapechar='\\')
Затем я обрабатываю каждую строку программы для чтения csv:
row = sms_reader.next()
У меня это в блоке try
, потому что очень редко он выбрасывает UnicodeEncodeError
, когда что-то не так. Но опять же, это очень редко для меня.
Моя проблема в том, что, похоже, это все время выдается все время для других пользователей моего сценария, использующих символы не-ASCII в своих SMS-сообщениях. Немецкий пользователь недавно связался со мной, сказав, что только около 10% его SMS-сообщений были правильно декодированы. Он прислал мне свой файл .pib, я проверил его по сценарию, и у меня не было ни одной проблемы с конвертацией. Весь вывод казался стандартным ANSI / ISO 8859-1 / Windows-1252 / чем угодно, так что вряд ли экзотика.
Мой вопрос: почему эти пользователи не могут декодировать свои входные данные, когда у меня нет проблем, используя точно такой же код (и версию Python)? И как продолжение, что я могу сделать, чтобы изменить мой сценарий, чтобы он работал для всех?
РЕДАКТИРОВАТЬ: я не упомянул один важный момент: я запускаю скрипт в Eclipse с использованием PyDev. Когда я запускаю его в командной строке, он выдает все те же проблемы, что и для всех остальных! Я до сих пор не знаю, в чем проблема, но, надеюсь, это поможет сузить ее.
Пример очень простого файла .csm (извлеченного из файла .pib, измененные имена и номера) с нестандартными символами будет следующим:
Msg Id;Sender Name;Sender Address;Sender AddressType;Prefix;Subject;Body;BodyType;Folder;Account;Msg Class;Content Length;Msg Size;Msg Flags;Msg Status;Modify Time;Delivery Time;Recipient Nbr;Recipients;Attachment Nbr;Attachments
0x00,0x00;"491703000000";"491703000000";;"";"Wir wünschen dem rainer alles gute und viel gesundheit! Bis nächste woche, wir hören uns bis dahin noch mal.. Liebe grüße aus md!";"";0;"\\%MDF3";"SMS";"IPM.SMStext";;;33;262144;2007,09,23,19,44,32;2007,09,23,19,44,31;1;"851980\;Gela\;+491739000000\;1\;0\;SMS";0;""
Нетрудно точно понять, в чем проблема, просто работая с этой строкой, поскольку я сам не испытываю исключения.
Другой пример, в котором у do есть проблемы (даже в Eclipse), следующий:
Msg Id;Sender Name;Sender Address;Sender AddressType;Prefix;Subject;Body;BodyType;Folder;Account;Msg Class;Content Length;Msg Size;Msg Flags;Msg Status;Modify Time;Delivery Time;Recipient Nbr;Recipients;Attachment Nbr;Attachments
0x00,0x00;"Jonas/M";"\"Jonas/M\" <+46737000000>";;"";"Den går 28 ";"";2;"\\%MDF4";"SMS";"IPM.SMStext";0;24;0;0;2011,03,12,21,15,19;2011,03,12,21,16,17;0;"";0;""
0x00,0x00;"Don Vär";"\"Don Vär\" <+46709000000>";;"";"försöke® dhdjhdhhdjehdejehţýùhbfvfghjujhuikjkłánjajnxsjajmsxnsmajmkjsnshdjnsjmwkjhdnjsjmwkjdhjjdewjjwjwjw®";"";2;"\\%MDF1";"SMS";"IPM.SMStext";0;212;1;0;2010,05,17,15,56,49;2010,05,17,15,55,46;0;"";0;""
Трассировка исключения:
Traceback (most recent call last):
File "C:\Programming\workspace\pim2smsbr\src\pim2smsbr.py", line 207, in <module>
convert(args.source[0], args.out)
File "C:\Programming\workspace\pim2smsbr\src\pim2smsbr.py", line 98, in convert
row = sms_reader.next()
File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\ue403' in position 77: character maps to <undefined>
UPDATE:
Ответ Джона Мачина, приведенный ниже, приносит удовольствие. Я просто поменял одну строчку и все хорошо. Изменения:
sms_text = csv_file.read().decode('utf-16').split(os.linesep)
Кому:
sms_text = csv_file.read().decode('utf-16').encode('utf-8').splitlines()