2011-01-16 1 views
6

커미션 분기점 (CJ)에서 HORRIBLE 웹 서비스를 사용하려고합니다. 클라이언트를 연결하여 CJ에서 정보를받을 수는 있지만 데이터베이스에는 UnicideDecodeError가 발생하는 여러 가지 나쁜 문자가 포함되어있는 것으로 보입니다.Python Suds에서 웹 서비스를 사용할 때 유니 코드 문제를 해결하는 방법

지금은 뭐하는 거지 :

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') 

내가 다음 ®는 휴식을 원인과 내가

를 얻을 '모든 서비스 10 % 할인 CorpNet®'같은 것을 가지고있는 기록을 명중 할 때까지 잘 작동
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 758: ordinal not in range(128)" error. 

결과에서 SUDS가 읽힐 때 끊어지지 않도록 내 끝에 ®을 인코딩하는 방법이 있습니까?

업데이트 : 명확히하기 위해 ®는 CJ 데이터베이스에서 오는 것으로 응답했습니다. 그래서 여하튼 나는 응답을 다루기 전에 비 아스키 문자를 디코딩 할 필요가있다. 나는 이것이 SUD에서 어떻게 (또는) 이루어질 지 확신하지 못한다.

+0

'str'과 'unicode'객체가 섞이지 않도록하십시오. 예를 들어'u'a '+'® '가 오류를 일으킬 수 있습니다. 가능한 한 일찍 유니 코드 입력을 디코드하십시오. – jfs

답변

3

암시 적 UnicodeDecodeErrors는 str 및 unicode 객체를 추가하려고 할 때 얻을 수있는 것입니다. 파이썬은 str을 유니 코드로 디코딩하려고 시도하지만 ASCII 인코딩을 사용합니다. str에 ascii가 아닌 내용이 있으면이 오류가 발생합니다.

귀하의 솔루션은 디코드 그것은과 같이 수동입니다 : 가능한 한 많은

thestring = thestring.decode('utf8') 

시도는, 수도는 김과 같은 비 ASCII 문자를 포함 할 것을 임의의 문자열을 디코딩하는 당신이에서를 건네대로 무엇이든 당신이 얻는 모듈,이 경우 suds.

그렇다면 suds가 유니 코드를 처리 할 수없는 경우 (이 경우 가능) 텍스트를 suds (또는 유니 코드를 제공하는 경우 중단되는 다른 라이브러리)로 다시 넘기기 전에 다시 인코딩해야합니다.

이렇게하면 문제가 해결됩니다. 모든 내부 처리를 str에서 unicode로 옮길 필요가 있기 때문에 큰 변화가 될 수 있지만, 그만한 가치가 있습니다. :)

+0

Lennart. 문제는 ASCII 문자가 아닌 문자가 실제로 CJ 데이터베이스와 응답에서 보내는 것입니다. 따라서 SUDS가 구문 분석을 시도하고 오류를 throw하기 전에 응답을 디코딩 할 수있는 방법을 잘 모릅니다. 요청을 보내고 응답을 디코딩 한 다음 응답을 파싱하려면 다른 방법이 필요합니다. 그러나 SUD에서이 작업을 수행 할 수있는 방법은 없습니다. – chris

+0

@chris : 코드가 데이터를 처리하기 전에도 오류가 발생합니다. 이 경우 그것은 suds 또는 서버의 버그입니다. 아마도 서버가 다른 것으로 주장 할 때 UTF로 인코딩 된 데이터를 보냅니 까? –

+0

Lennart - 정확함. 나는 그것이 (내가 제어 할 수없는) 서버에서 일어나고 있다고 확신한다. 커미션 정션 (Commision Junction)은 웹 서비스를 지원하지 않는 것 같아요. SUD에 다시 입력되기 전에 데이터를 수정해야한다고 생각했습니다. 나는 그것이 긴 총이었다고 생각하고 있었다. 그러나 내가 아마 무엇인가 놓치고있다라고 생각했다. – chris

1

"등록 된"문자는 U + 00AE이며 UTF-8에서는 "\xc2\xae"으로 인코딩됩니다. UTF-8로 인코딩 된 str 오브젝트가있는 것처럼 보이지만 일부 코드는 (아마도 디폴트로) your_str_object.decode("ascii") 일 수 있습니다. 이는 사용자가 표시 한 오류 메시지와 함께 실패합니다.

당신이해야 할 일은 전체 예제 (즉, 오류를 가져 오는 데 필요한 모든 코드)와 전체 오류 메시지와 추적 코드를 보여 주므로 적어도 문제가 코드에 있는지 또는 가져온 코드.

+0

명확해야합니다. 오류의 원인이되는 데이터는 웹 서비스의 응답으로 반환됩니다. 그래서 작동하는 요청을 보내지 만 CJ가 응답에서 "등록 된"문자로 회신 할 때 문제가 발생합니다. 그래서 내가해야 할 일은 SUDS가 그것을 분석하기 전에 어떻게 든 문자를 깨끗이하는 것입니다. 위에서 코드는 웹 서비스 응답 및 SUD 오류를 얻으려면 SUDS와 모두해야합니다. – chris

+0

@chris : ** ** 모든 ** 작업은 예외를 발생시키는 문제에 대해 질문 할 때 모두가해야 할 일입니다. 문제를 일으키는 데 필요한 최소한의 코드를 실행하고 전체 오류 메시지와 추적을 복사하여 붙여 넣으십시오. 당신의 질문에 대한 편집. 그건 그렇고, 응답에서 "등록 된"캐릭터라는 것을 어떻게 알 수 있습니까? –

+0

John - 제가 실행 한 코드는 제가 질문에 넣었습니다. "UnicodeDecodeError : 'ascii'코덱은 759 위치의 0xc2 바이트를 디코딩 할 수 없습니다. 서수는 범위 (128)에 없습니다." 그 너머에 무엇을 요구하고 있는지 확실하지 않습니다. ASCII 문자를 깨뜨리지 않고 "등록 된"문자를 깨는 결과가 응답에 포함되어 있다는 것을 알 수있는 또 다른 비누 클라이언트를 사용할 수 있기 때문에 "등록 된"문자라는 것을 알고 있습니다. 결과에 "등록 된"문자가 포함되어 있지 않으면 결과가 올바르게 반환됩니다. 문제는 SUD에서 끝나고, 나는 빈민굴 패치를했다. 감사합니다 – chris

0

SOAP API를 통해 Salesforce와의 인터페이스에 SUDS를 사용하고 있습니다. str과 유니 코드 문자열 유형을 혼합하지 않음으로써 @ J.F.Sabastian의 조언을 따를 때까지 동일한 상황이 발생했습니다. 예를 들어,이 같은 SOQL의 문자열을 전달하는 SUDS 0.3.9 작업 않습니다

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

나도 ("UTF-8") str.decode을 할 필요가 보이지 않았다.

이클립스의 PyDev에서 스크립트를 실행하는 경우 Project => Properties로 이동하고 Resource에서 "Text File Encoding"을 UTF-8로 설정하면됩니다. 내 Mac에서는 "MacRoman ". Windoze에서 기본값은 Cp1252 또는 ISO-8859-1 (라틴어)입니다.프로젝트의 작업 공간에서이 설정을 작업 영역에서 상속받을 수도 있습니다. 이는 프로그램 소스 코드에만 영향을줍니다.

관련 문제