2011-06-24 14 views
4

文字列「文字を含む」をJava jax-ws SOAPサービスに送信するSilverlightクライアントアプリケーションがあります。.netとJavaの間の文字列エンコーディング

私が何をしていても、私はいつも「文字を含んでいますか?」と「反対側に」を得ています。 ( "â"は働いているが、他の人はそうではない)。

私もHttpUtility.UrlEncode("ş ţ ă and â î")を銀色で試したことがありますが、JavaのURLDecoder.decode(inputText, "UTF-8")はまだそれらの3文字の代わりに私に与えています。

何が起こっているのですか? Javaの文字列は、デフォルトでUTF-8でエンコードされているはずです。また、.netのエンコーディングはUnicode(実際はUTF-16)です。しかし、もし私がUnicodeやUTF-16をJava側でデコードすると、それらの特殊文字はすべて「?」になります。

ご迷惑をおかけして申し訳ありません。


[編集]私はSilverlightの側に使用していますどのようなエンコーディング見てみたい、またはエンコーディングを自分で指定します。私が作成したクライアントは、WSDLを指定した参照の追加(Add Reference)です。そこから、.NETは私のためにすべてを行い、クライアントクラスと必要なイベントと関数。クライアントの要点は次のとおりです。

  FooWildcardSOAPClient client = new FooWildcardSOAPClient(); 
      client.CallFooServiceCompleted += new EventHandler<CallFooServiceCompletedEventArgs>(client_CallFooServiceCompleted); 

      client.CallFooServiceAsync(param1, HttpUtility.UrlEncode(inputString), args); 

自動生成コードを閲覧しましたが、どこでエンコードを指定するのかわかりませんでした。

そしてここでは、Java側である:

@WebService(targetNamespace = "http://jaxwscalcul.org", 
     name="FooWildcardSOAP", 
     serviceName="FooWildcardService") 
@SOAPBinding( style=SOAPBinding.Style.DOCUMENT, 
     use=SOAPBinding.Use.LITERAL) 
public class FooWildcardServiceImpl { 

    @WebMethod(operationName="CallFooService", action="urn:FooWildcardService") 
    @WebResult(name="result") 
    public String getOutput(
      @WebParam(name="FooServiceWSDL") String param1, 
      @WebParam(name="inputTextOrXML") String inputText, 
      @WebParam(name="otherArgsString") String[] otherArgs) 
    { 
     try { 
      inputText = URLDecoder.decode(inputText, "UTF-16LE");//ISO-8859-1 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("\r\n\r\n"+inputText); 
    } 

[EDIT2]私はバイオリンを使用しました、とワイヤ上のコンテンツがtext/xmlでのUTF-8であることを私が見ることができる、とjavaに表示されない "şţă"の文字のような実際のデータは、正しく表示されます。

Client: 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6,ro;q=0.4,fr-FR;q=0.2,de;q=0.2 
Entity: 
content-type: text/xml; charset=utf-8 
+1

あなたは、あなたが正確に前後に行くバイトを教えることができるユーティリティの恩恵を受けるような感じです。 –

+0

私はあなたが文字の内部表現をデフォルトのエンコーディングと混同していると思います。中間的には、すべてのJava文字列はUTF-16として表されますが、これは「デフォルト」エンコーディングとは関係ありません。オプションの 'Charset'または' String'引数(文字セットを指定できるようにする)をとるほとんどのメソッドは、オプションの引数が省略されている場合に** platform **のデフォルトの文字セットを使用します。 –

+0

例:['String#getBytes()'](http://download.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes%28%29)および['String #getBytes(Charset) '](http://download.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes%28java.nio.charset.Charset%29) –

答えて

5

経由Luther Blissett's answer "UTF-16 != UTF-16"

はここフィドラーからいくつかのペーストです

Javaでは、GetBytesメソッド( "UTF-16")はビッグエンディアンです。

C#では、Encoding.Unicode.GetBytesはリトルエンディアンです。

Java側では、getBytes( "UTF-16LE")を試してください。

詳細な説明については、Big and little endian byte orderを参照してください。

+0

私はそれを知らなかったが、それは問題を解決しない。私はすべての記号のために?sを得る。 – Spectraljump

+0

URLエンコーダ/デコーダのコードを削除するとどうなりますか? –

+0

まったく同じこと(私が質問で言ったように、 "âî"を除くすべての特別な文字は変わる?)。私がurlencode/decodeを追加した理由は、問題を解決しようとすることでした。 – Spectraljump

関連する問題