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

标签 java netbeans encoding httprequest apache-commons-httpclient

我的 Java 程序(或更确切地说,它的一部分)向网络服务发送请求并接收 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.");
    }

网络服务是 Perseus 形态学服务,可以在这里找到: 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 的单参数构造函数的更多用途,它们也使用默认编码。

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

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

(这来自您似乎正在使用的 apache HttpClient API)。 另见 this Q on SO .

关于java - Oracle Java 程序新开发的编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23604115/

相关文章:

netbeans - 查看netbeans中的执行线

Python 请求模块 JSON 格式

Python - 复制jpg文件时出错

java - 使用类别注释在 IntelliJ 中运行 JUnit 测试

java - 在具有重复条目的数组中查找具有最大(全局)值的对象

java - Netbeans 8.0 和网络项目太慢

java - 无法运行 "java HelloWorld"错误找不到主类

perl - 使用 PAR Packer 进行编码时需要包含哪些内容

Java 服务器 -- 使用 POST 发送 Push 到 google Firebase Cloud

java - 如何获取 ":"之间的子字符串