Oracle Java程序新开发的编码问题



我的Java程序(更确切地说,是它的一部分)向webservice发送请求并接收rdf字符串,其中包括unicode格式的古希腊单词。我在netbeans中编写了这个程序,到目前为止,在运行时都没有出现问题,无论是在netbeans环境中还是在Linux和Windows XP下作为独立的jar。现在,rdf中的希腊单词突然像这样乱码返回:

¼€

起初,我以为这是Windows XP的问题,但在Windows 7下检查时,问题仍然存在。我发现我在Linux下运行OpenJDK,并且能够使用Oracle Java重现这个问题。这是相关的代码(当然,我可能有隧道视野,所以如果你需要更多的请告诉我):

try {
        HttpClient client = new DefaultHttpClient();
        HttpGet get;
        get = new HttpGet(URL+URLEncoder.encode(form, "UTF-8"));
        HttpResponse response = client.execute(get);
        if (201 == response.getStatusLine().getStatusCode()) {
            HttpEntity respEnt = response.getEntity();
            BufferedReader reader = new BufferedReader(new InputStreamReader(respEnt.getContent()));
            StringBuilder sb = new StringBuilder();
            char[] cbuffer = new char[256];
            int read;
            while ((read = reader.read(cbuffer)) != -1) {
                sb.append(cbuffer,0,read);
            }
            //System.out.println(sb.toString());
            rdf = new String(sb.toString().getBytes("UTF-8"),"UTF-8");
        } else {
            System.err.println("HTTP Request fehlgeschlagen.");
        }         
    } catch (IOException e) {
        System.err.println("Problem beim HTTP Request.");
    }

web服务是珀尔修斯形态学服务,它可以在这里找到:http://services.perseids.org/bsp/morphologyservice/analysis/word?lang=grc&engine=morpheusgrc&word=。例如,试试"word=μ νιν"。rdf是如何或何时生成的,我真的不知道。

我将非常感谢进一步的见解!

确保字符串的编码在客户机和服务器之间是一致的。当然,在您的情况下,服务器响应(rdf-strings)是最重要的(在服务器端编码,在客户端代码中解码)。

关于你发布的客户端代码有一件事:在这一行中,您正在使用InputStreamReader的一个参数构造函数:
BufferedReader reader = new BufferedReader(new InputStreamReader(respEnt.getContent()));

它将使用VM(和系统)默认字符集从输入流中读取,因此结果将取决于您正在运行客户端应用程序的机器/VM。尝试使用以下构造函数显式设置字符集

new InputStreamReader(url.openStream(), "UTF-8")

参见API-doc。

在您的代码中搜索InputStreamReaderOutputStreamWriter的单参数构造函数的更多用法,它们也使用默认编码。

如果您无法控制服务器代码(web服务实现),您可以尝试像这样查找答案字符集:

Header contentType = response.getFirstHeader("Content-Type");
String charset= contentType.getValue();

(这是从apache HttpClient API你似乎正在使用)。

相关内容

  • 没有找到相关文章

最新更新