7

Commission Junction (CJ) で HORRIBLE Web サービスを使用しようとしています。クライアントに接続して 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% オフ」のようなレコードに到達するまでは問題なく機能します。

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

SUDS が結果を読み取ったときに壊れないように、私の側で ® をエンコードする方法はありますか?

更新: 明確にするために、® は CJ データベースからのものであり、その応答にあります。SOどういうわけか、SUDSが応答を処理する前に非ASCII文字をデコードする必要があります。これが SUD でどのように行われるか (または行われるかどうか) はわかりません。

4

3 に答える 3

3

暗黙の UnicodeDecodeErrors は、str および unicode オブジェクトを追加しようとしたときに発生するものです。次に、Python は str を Unicode にデコードしようとしますが、ASCII エンコーディングを使用します。str に ascii 以外のものが含まれていると、このエラーが発生します。

あなたの解決策は、次のように手動でデコードすることです:

thestring = thestring.decode('utf8')

非ASCII文字を含む可能性のある文字列は、取得元のモジュール(この場合はsuds)から渡されるのと同じように、可能な限りデコードしてください。

次に、suds が Unicode を処理できない場合 (その可能性があります)、テキストを suds (または unicode を指定すると壊れる他のライブラリ) に戻す直前にエンコードして戻してください。

それは物事をうまく解決するはずです。すべての内部処理を str から unicode に移動する必要があるため、大きな変更になる可能性がありますが、それだけの価値はあります。:)

于 2011-01-16T08:31:34.327 に答える
1

「登録済み」文字はU+00AEであり"\xc2\xae"、UTF-8のようにエンコードされます。UTF-8でエンコードされたstrオブジェクトがあるように見えますが、一部のコードが実行されており(おそらくデフォルトで)your_str_object.decode("ascii")、表示されたエラーメッセージで失敗します。

あなたがする必要があるのは、完全な例(つまり、エラーを取得するために必要なすべてのコード)に加えて、完全なエラーメッセージとトレースバックを表示することです。これにより、少なくとも問題がコードにあるのか、インポートされたコードにあるのかを推測できます。

于 2011-01-16T04:09:14.640 に答える
0

私は SUDS を使用して、SOAP API 経由で Salesforce とやり取りしています。@JFSabastian のアドバイスに従い、str と unicode の文字列型を混在させない限り、同じ状況に陥りました。たとえば、次のような 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") もする必要がなかったようです。

Eclipse で PyDev からスクリプトを実行している場合は、[Project] => [Properties] に移動し、[Resource] の下で [Text File Encoding] を UTF-8 に設定すると、私の Mac ではデフォルトで [MacRoman] になります。Windoze では、デフォルトは Cp1252 または ISO-8859-1 (Latin) のいずれかであると思います。プロジェクトのワークスペースでこれを設定して、ワークスペースからこの設定を継承することもできます。これは、プログラムのソース コードにのみ影響します。

于 2011-01-20T19:08:12.160 に答える