java - .net 和 Java 之间的字符串编码

标签 java .net silverlight character-encoding

我有一个 Silverlight 客户端应用程序,它将“包括字符 ş ţ ă 和 â î”的字符串发送到 Java jax-ws SOAP 服务。

现在,无论我做什么,另一边总是显示“包括字符 ? ? ? 和 â î”。 (“â î”有效,但其他无效)。

我什至在 silverlight 中尝试过 HttpUtility.UrlEncode("ş ţ ă and â î"),但是 URLDecoder.decode(inputText, "UTF-8") 在 Java 中仍然给我 ?s 而不是那 3 个字符。

这是怎么回事?默认情况下,Java 字符串应该以 UTF-8 编码,对吧?而.net中的编码是Unicode(实际上是UTF-16)。但是,如果我在 Java 端使用 Unicode 或 UTF-16 进行解码,我会将所有这些特殊字符转换为 ?s(包括 â î)。

非常感谢任何帮助!


[edit] 我很想看看我在 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] 我用过 Fiddler,我可以看到线路上的内容是 text/xml UTF-8,以及实际数据,如“ş ţ ă”中未显示的字符java,正确地在线上显示。

以下是 Fiddler 的一些粘贴:

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

最佳答案

通过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 .

关于java - .net 和 Java 之间的字符串编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470013/

相关文章:

c# - 如何从 C# .NET 4.5 中的 zip 存档中提取特定目录?

Silverlight 将 DataContext 传递给 ConverterParameter?

.net - 用Mono中的NuGet打包项目未实现错误

c# - 当文本填满框时,强制文本 block 在最右侧显示文本(不在左侧显示文本)

wpf - Canvas 背景颜色不显示

java - 将中心面板添加到我的内容 Pane 时 GUI 对象消失

java - 返回类型与 FragmentPagerAdapter.getItem(int) 不兼容 更多错误

java - 使用 Comparable 接口(interface)对任何类型的数据进行排序

java - Selenium 测试后的数据库清理

c# - 如何检测笔记本电脑电源线何时断开?