2011-06-24 12 views
4

我有一個Silverlight客戶端應用程序,它將字符串「包括字符和數字」發送到Java jax-ws SOAP服務。.net和Java之間的字符串編碼

現在,無論我做什麼,我總是會在另一邊「包括角色??和â」。 (「â」工作但其他人不)。

我甚至已經在Silverlight中嘗試了HttpUtility.UrlEncode("ş ţ ă and â î"),但是在Java中的URLDecoder.decode(inputText, "UTF-8")仍然給我用來代替這3個字符。

這是怎麼回事? Java字符串應該默認以UTF-8編碼,對吧?而.net中的編碼是Unicode(實際上是UTF-16)。但是如果我在java端使用Unicode或UTF-16進行解碼,我會得到所有這些特殊字符轉向?(包括)。

任何幫助,非常感謝!


[編輯]我很想看到我使用的Silverlight的側什麼編碼,或指定一個編碼自己。問題是,我找不到在哪裏/如何做到這一點:我創建的客戶端是通過服務引用 - >添加引用來指定WSDL,並從那裏開始,.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」參數(允許指定要使用的字符集)的方法將在省略可選參數時使用**平臺**默認字符集。 –

+0

例如:['字符串#的getBytes()'](http://download.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes%28%29)和['字符串#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是little-endian。

在Java方面,請嘗試getBytes(「UTF-16LE」)。請參閱Big and little endian byte order

+0

我不知道,但它不能解決問題。我得到了所有符號的符號。 – Spectraljump

+0

如果刪除URLEncoder/Decoder代碼...會發生什麼? –

+0

完全一樣的東西(正如我在問題中所說的,除了「â」之外的每個特殊字符都變成了?s)。我添加urlencode/decode的原因是爲了解決這個問題。 – Spectraljump