我的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。
在您的代码中搜索InputStreamReader和OutputStreamWriter的单参数构造函数的更多用法,它们也使用默认编码。
如果您无法控制服务器代码(web服务实现),您可以尝试像这样查找答案字符集:
Header contentType = response.getFirstHeader("Content-Type");
String charset= contentType.getValue();
(这是从apache HttpClient API你似乎正在使用)。