Не может проанализировать и отобразить non-utf8 символы, считанные из запроса HTTP

Если Вы хотите очистить отделение и удалить все дочерние узлы, Вы могли бы поместить:

var mydiv = document.getElementById('FirstDiv');
while(mydiv.firstChild) {
  mydiv.removeChild(mydiv.firstChild);
}
8
задан Gray 16 October 2012 в 03:00
поделиться

5 ответов

Важной частью проблемы является то, как вы обрабатываете содержимое ответа HTTP. То есть как вы создаете объект json ? К тому времени, когда вы дойдете до кода в своем исходном сообщении, его содержимое уже будет повреждено.

Результатом запроса являются данные в кодировке UTF-8. Как вы разбираете его на объекты JSON? Правильная ли кодировка указана для декодера? Или используется кодировка символов вашей платформы по умолчанию?

1
ответ дан 5 December 2019 в 14:03
поделиться

Сначала попробуйте следующее:

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 .

Изменить : если проблема на самом деле в используемом API JSON, и вы не используете Не знаю, что выбрать, то рекомендую использовать Gson . Это действительно упрощает преобразование строки Json в простой в использовании javabean. Вот простой пример:

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
ответ дан 5 December 2019 в 14:03
поделиться

API Google правильно отправляет UTF-8. Я думаю, проблема в том, что ваша кодировка по умолчанию не позволяет выводить арабский язык. Проверьте свойство file.encoding или получите такую ​​кодировку,

public static String getDefaultCharSet() throws IOException {
    OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
    return writer.getEncoding();
}

Если кодировка по умолчанию - ASCII или Latin-1, вы получите «?» S. Вам нужно изменить его на UTF-8.

0
ответ дан 5 December 2019 в 14:03
поделиться

Проблема, скорее всего, вызвана неправильной настройкой кодировки символов в том месте, которое вы читаете в HTTP-ответе от Google. Можете ли вы опубликовать код, который фактически получает URL-адрес и анализирует его в объекте JSON?

В качестве примера запустите следующее:

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"); никогда не будет работать прочтите статью Джоэла о юникоде

7
ответ дан 5 December 2019 в 14:03
поделиться

Я думаю, что пакет JSON.org Java JSON не может обрабатывать UTF8, независимо от того, передается он как символ UTF8 или фактически передается в коде \ uXXXX . Я попробовал оба варианта следующим образом:

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();
        }
    }
}

Получаю:

{"a":"?"}
{"a":"?"}

Есть идеи?

2
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: