Как исправить проблему с юникодом при использовании веб-сервиса с Python Suds - PullRequest
7 голосов
/ 16 января 2011

Я пытаюсь работать с УЖАСНЫМИ веб-сервисами в Commission Junction (CJ).Я могу заставить клиента подключаться и получать информацию от CJ, но их база данных, кажется, содержит кучу плохих символов, которые вызывают UnicideDecodeError.

Прямо сейчас я делаю:

from suds.client import Client
wsdlLink = 'https://link-search.api.cj.com/wsdl/version2/linkSearchServiceV2.wsdl'
client = Client(wsdlLink)
result = client.service.searchLinks(developerKey='XXX', websiteId='XXX', promotionType='coupon')

Это работает нормально, пока я не нажму на запись, которая имеет что-то вроде 'CorpNet® 10% Off Any Service', затем ® вызывает ее разрывЯ получаю

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 758: ordinal not in range(128)" error.

Есть ли способ кодировать ® на моем конце, чтобы он не ломался, когда SUDS считывает результат?

ОБНОВЛЕНИЕ : Комууточнить, ® приходит из базы данных CJ и находится в их ответе.ТАК как-то мне нужно декодировать не-ascii символы ПЕРЕД SUDS имеет дело с ответом.Я не уверен, как (или если) это делается в SUD.

Ответы [ 3 ]

3 голосов
/ 16 января 2011

Неявные UnicodeDecodeErrors - это то, что вы получаете, когда пытаетесь добавить объекты str и unicode.Затем Python попытается декодировать str в unicode, но с использованием кодировки ASCII.Если ваша строка затем содержит что-то, что не является ascii, вы получите эту ошибку.

Ваше решение - это расшифровать ее вручную следующим образом:

thestring = thestring.decode('utf8')

Попробуйте, насколько это возможно,декодируйте любую строку, которая может содержать символы не-ascii, такие как soo, как если бы вы получили ее из любого модуля, из которого вы ее получили, в этом случае suds.

Затем, если suds не может обработатьUnicode (что может иметь место), убедитесь, что вы закодировали его обратно перед передачей текста в suds (или любую другую библиотеку, которая прервется, если вы передадите ей unicode).

Это должно хорошо решить проблемы.Это может быть большим изменением, так как вам нужно переместить всю вашу внутреннюю обработку с str на unicode, но оно того стоит.:)

1 голос
/ 16 января 2011

«Зарегистрированный» символ - U + 00AE и кодируется как "\xc2\xae" в UTF-8.Похоже, у вас есть объект str, закодированный в UTF-8, но какой-то код выполняет (вероятно, по умолчанию) your_str_object.decode("ascii"), что приведет к ошибке с сообщением, которое вы показали.

Что вам нужно сделать, это показать намполный пример (т. е. ВСЕ код, необходимый для получения ошибки), а также полное сообщение об ошибке и трассировку, чтобы, по крайней мере, мы могли догадаться, есть ли проблема в вашем коде или в импортированном коде.

0 голосов
/ 20 января 2011

Я использую SUDS для взаимодействия с Salesforce через их SOAP API.Я сталкивался с той же ситуацией, пока не последовал совету @ JFSabastian, не смешивая строковые и юникодные типы строк.Например, передача строки SOQL, подобной этой, работает с SUDS 0.3.9:

qstr = u"select Id, FirstName, LastName from Contact where FirstName='%s' and LastName='%s'"  % (u'Jorge', u'López')

Мне, кажется, не нужно было также вводить str.decode ("utf-8").

Если вы запускаете свой скрипт из PyDev в Eclipse, вы можете зайти в Project => Properties и в разделе «Ресурс» установить «Кодировка текстового файла» в UTF-8, на моем Mac по умолчанию это «MacRoman».Я полагаю, что в Windoze по умолчанию используется Cp1252 или ISO-8859-1 (латиница).Вы также можете установить это в своем рабочем пространстве ваших проектов, наследуя этот параметр из своего рабочего пространства.Это влияет только на исходный код программы.

...