2014-05-22 3 views
2

라이브러리 "suds"를 사용하여 SOAP 서버와 통신합니다. 요청이 성공적으로 수행 한 후에, 나는 대답납니다이상한 파이썬 유형 "텍스트"?

answer = client.invoke('RetrieveBLABLAObject', modelthings) 

이 답변이 요청 된 개체의 다양한 분야의 구조입니다. 각 필드는 "문자열"매개 변수 "_ 유형"과 매개 변수 "값"으로 구성되는 구조로, 유형이 다를 수 있습니다.

[key] [value] - 매개 변수 "value"의 값을 반환합니다. 그러나 디버그 모드 (Python 2.7.6 및 PyCharm 사용)에서는 값에 "텍스트"유형이 있음을 보여줍니다. "str"이 아니라 "unicode"가 아니라 "Text".

나는 그것이 "유니 코드"이 텍스트를 계산 내게 보여

isinstance(obj[cur_key]['value'], unicode) 

하여 확인하세요. 그러나 동일한 신체와 유니 코드를 비교하면 false를 반환합니다.

if obj[cur_key]['value'] != u'String that I know is there': 
    print("true") #it is printing, but it shouldn't 

왜 이런 일이 발생합니까? "텍스트"를 유니 코드로 변환하려면 어떻게해야합니까? 나는 예외 폭포

obj[cur_key]['value'].decode('utf-8') 

을 시도했다. 이 "텍스트"유형을 어떻게 처리 할 수 ​​있습니까?

+0

'repr (obj [cur_key] [ 'value'])'당신에게주는 것은 무엇입니까? 그리고 무슨 예외입니까? – geoffspear

+0

@Martijn은 옳았습니다. 서브 클래스 였고 모든 것이 그가 묘사 한 것입니다. 어쨌든 도움을 주셔서 감사합니다. – Arkady

답변

8

unicode의 하위 클래스가있을 가능성이 높습니다. 여기에 suds.sax.text.Text()의 인스턴스가 있다고 생각합니다. 이 값은 서브 클래스이므로 isinstance(obj, unicode)이 참입니다. 디코딩이 참으로 실패 ASCII와 첫번째 암시 인코딩를 게재 할 수 있도록

그건 값은 이미 유니 코드 문자열입니다.

unicode(obj[cur_key]['value']) 

을하지만 여전히 XML이 탈출 할 수 있습니다 계정으로 값을;

당신은 단순히 사용하여 유니 코드 형식을 변환 할 수 있습니다 .unescape() 메서드는 이스케이프 처리되지 않은 버전을 반환합니다 (값이 이스케이프 처리되지 않은 경우 self을 반환합니다).

다른 문자열과 비교할 때 이 정확히 인 지 확인하십시오. 유니 코드 값에는 너비가 0 인 문자 또는 으로 표시 될 수있는 결합 문자 (예 : 양식)와 같이 '숨겨진'값이 많이 포함될 수 있습니다. 이러한 코드 포인트를보다 명확하게 만드는 이스케이프 처리 된 표현을 얻으려면 repr(value)을 사용하십시오.

suds.sax.text.Text() 클래스는 특수 문자 평등 테스트가 아니므로 != 테스트는 값이 하위 클래스 대신 unicode 문자열 인 것처럼 똑같이 작동합니다.