首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法解析和显示从http请求中读取的非UTF8字符

无法解析和显示从http请求中读取的非UTF8字符
EN

Stack Overflow用户
提问于 2009-11-17 02:22:00
回答 6查看 28.1K关注 0票数 9

我正在使用Java来解析这个请求

http://ajax.googleapis.com/ajax/services/search/web?start=0&rsz=large&v=1.0&q=rz+img+news+recordid+border

其结果是该JSON文件(为简洁起见被截断):

代码语言:javascript
运行
复制
{"responseData":{"results":
<...>
"visibleUrl":"www.coolcook.net",
"cacheUrl":"http://www.google.com/search?q\u003dcache:p4Ke5q6zpnUJ:www.coolcook.net",
"title":"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب",
"titleNoFormatting":"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب","\u003drz+img+news+recordid+border"}}, 
<...>
"responseDetails": null, "responseStatus": 200}

我的问题在于返回的阿拉伯字符(可以是任何非unicode字符)。我尝试使用如下命令将它们转换回unicode:

代码语言:javascript
运行
复制
JSONArray ja = json.getJSONObject("responseData").getJSONArray("results");
JSONObject j = ja.getJSONObject(i);
str = j.getString("titleNoFormatting");
logger.log("before: " + str); // this is just my version of println
enc_str = new String (str.getBytes(), "UTF8");
logger.log("after: " + enc_str);

然而,“之前”和“之后”的结果是相同的:一组?,无论我是在服务器日志文件中还是在HTML页面中输出它们。有没有其他方法可以取回阿拉伯字符并将它们输出到网页中?

对于这类问题,JSON是否有任何支持功能,也许是为了直接从JSONObject中读取非utf字符?

EN

回答 6

Stack Overflow用户

发布于 2009-11-17 03:10:16

您遇到的问题很可能是由于您在google的http响应中读取的点上的字符编码设置不正确导致的。您可以发布实际获取URL并将其解析为JSON对象的代码吗?

作为示例,运行以下命令:

代码语言:javascript
运行
复制
public class Test1 {
  public static void main(String [] args) throws Exception {

    // just testing that the console can output the correct chars
    System.out.println("\"title\":\"مطبخ مطايب - كباب الدجاج والخضار بصلصة الروب");

    URL url = new URL("http://ajax.googleapis.com/ajax/services/search/web?start=0&rsz=large&v=1.0&q=rz+img+news+recordid+border");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    InputStream is  = connection.getInputStream();

    // the important bit is here..........................\/\/\/
    InputStreamReader reader = new InputStreamReader(is, "utf-8");


    StringWriter sw = new StringWriter();

    char [] buffer = new char[1024 * 8];
    int count ;

    while( (count = reader.read(buffer)) != -1){
      sw.write(buffer, 0, count);
    }

    System.out.println(sw.toString());
  }
}

这是在使用相当丑陋的标准URL.openConnection(),它从一开始就存在。如果你正在使用像Apache httpclient这样的东西,那么你可以很容易地做到这一点。

要了解一些关于编码的背景知识,或者解释为什么new String (str.getBytes(), "UTF8");永远不会工作,请阅读Joel's article on unicode

票数 8
EN

Stack Overflow用户

发布于 2010-06-09 19:03:57

我认为JSON.org Java JSON包不能处理UTF8,无论它是作为UTF8字符传入还是实际传入\uXXXX代码。我尝试了这两种方法,如下所示:

代码语言:javascript
运行
复制
import org.json.
public class JsonTest extends TestCase {
    public void testParseText() {
        try {
            JSONObject json1 = new JSONObject("{\"a\":\"\u05dd\"}"); // \u05dd is a Hebrew character
            JSONObject json2 = new JSONObject("{\"a\":\"\\u05dd\"}"); // \u05dd is a Hebrew character
            System.out.println(json1.toString());
            System.out.println(json2.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

我得到了:

代码语言:javascript
运行
复制
{"a":"?"}
{"a":"?"}

有什么想法吗?

票数 2
EN

Stack Overflow用户

发布于 2009-11-17 02:31:01

先试试这个:

代码语言:javascript
运行
复制
str = j.getString("titleNoFormatting");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:/test.txt"), "UTF-8"));
writer.write(str);
writer.close();

然后在记事本中打开该文件。如果这看起来没问题,那么问题出在您的记录器或控制台没有配置为使用UTF-8。否则,问题很可能出在您使用的JSON API中,因为它没有配置为使用UTF-8

编辑:如果问题实际上出在所使用的JSON API中,并且您不知道该选择哪个,那么我建议您使用Gson。它非常容易将Json字符串转换为易于使用的javabean。下面是一个基本的例子:

代码语言:javascript
运行
复制
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;

import com.google.gson.Gson;

public class Test {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://ajax.googleapis.com/ajax/services/search/web"
            + "?start=0&rsz=large&v=1.0&q=rz+img+news+recordid+border");
        BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
        GoogleResults results = new Gson().fromJson(reader, GoogleResults.class);

        // Show all results.
        System.out.println(results);

        // Show title of 1st result (is arabic).
        System.out.println(results.getResponseData().getResults().get(0).getTitle());
    }

}

class GoogleResults {

    ResponseData responseData;
    public ResponseData getResponseData() { return responseData; }
    public void setResponseData(ResponseData responseData) { this.responseData = responseData; }
    public String toString() { return "ResponseData[" + responseData + "]"; }

    static class ResponseData {
        List<Result> results;
        public List<Result> getResults() { return results; }
        public void setResults(List<Result> results) { this.results = results; }
        public String toString() { return "Results[" + results + "]"; }
    }

    static class Result {
        private String url;
        private String title;
        public String getUrl() { return url; }
        public String getTitle() { return title; }
        public void setUrl(String url) { this.url = url; }
        public void setTitle(String title) { this.title = title; }
        public String toString() { return "Result[url:" + url +",title:" + title + "]"; }
    }

}

它可以很好地输出结果。希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1743935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档