Кодировать специальные символы из JSON (äöüß) - PullRequest
3 голосов
/ 26 мая 2011

Я сейчас разрабатываю немецкое приложение, оно извлекает данные из JSON в ListView.Так как есть некоторые специальные символы, такие как üöäß, с моим кодом ниже, эти символы отображаются как ? .

Кто-нибудь может помочь мне решить мою проблему?Thx

public class LooserSync extends IntentService {

    public LooserSync() {
        super("LooserSyncService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Database.OpenHelper dbhelper = new Database.OpenHelper(getBaseContext());
        SQLiteDatabase db = dbhelper.getWritableDatabase();
        DefaultHttpClient httpClient = new DefaultHttpClient();
        db.beginTransaction();
        HttpGet request = new HttpGet(
                "http://liebenwald.spendino.net/admanager/dev/android/projects.json");
        try {
            HttpResponse response = httpClient.execute(request);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                InputStream instream = response.getEntity().getContent();
                BufferedReader r = new BufferedReader(new InputStreamReader(
                        instream), 8000);
                StringBuilder total = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    total.append(line);
                }
                instream.close();
                String bufstring = total.toString();
                JSONArray arr = new JSONArray(bufstring);
                Database.Tables tab = Database.Tables.AllTables.get(Database.Project.NAME);
                tab.DeleteAll(db);
                for (int i = 0; i < arr.length(); i++) {
                    tab.InsertJSON(db, (JSONObject) arr.get(i));
                }
                db.setTransactionSuccessful();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        db.endTransaction();
        db.close();

    }

}

Ответы [ 5 ]

8 голосов
/ 26 мая 2011

Содержимое JSON использует UTF-8 в качестве набора символов по умолчанию (см. RFC 4627, глава 3 ). Необходимо убедиться, что сервер возвращает ответ с правильной кодировкой И, чтобы явно использовать кодировку UTF-8 для потокового считывателя:

BufferedReader r = new BufferedReader(new InputStreamReader(instream, "UTF-8"), 8000);
2 голосов
/ 26 мая 2011

Попробуйте явно определить кодировку для InputStreamReader, например:

String encoding = "ISO-8859-1";
BufferedReader reader = new BufferedReader(new InputStreamReader(is, encoding));
1 голос
/ 26 мая 2011

Используйте следующий код для получения данных на немецком языке, поскольку данные находятся в стандарте UTF-8

HttpGet request = new HttpGet(
                "http://liebenwald.spendino.net/admanager/dev/android/projects.json");

httpget.setHeader("charset", "utf-8");
        ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
    public String handleResponse(final HttpResponse response)
        throws HttpResponseException, IOException {
        StatusLine statusLine = response.getStatusLine();
        if (statusLine.getStatusCode() >= 300) {
            throw new HttpResponseException(statusLine.getStatusCode(),
                    statusLine.getReasonPhrase());
        }

        HttpEntity entity = response.getEntity();
        return entity == null ? null : EntityUtils.toString(entity, "UTF-8");
    }
} 

        String html = httpclient.execute(request, responseHandler);

Спасибо Deepak

0 голосов
/ 26 мая 2011

Возможное дублирование: Проблема с Android Java UTF-8 HttpClient .

Как правило, если вы ожидаете, что символ ASCII вам не нужендумать о кодировании;что сервер говорит вам, это кодировка и как правильно ее декодировать.

0 голосов
/ 26 мая 2011

Это заголовок ответа, который возвращает ваш URL:

Accept-Ranges:none
Connection:Keep-Alive
Content-Length:14572
Content-Type:text/plain
Date:Thu, 26 May 2011 11:47:52 GMT
ETag:"404f6-38ec-4a42a184b1c80;4a0b4ae611cc0"
Keep-Alive:timeout=15, max=100
Last-Modified:Thu, 26 May 2011 09:03:30 GMT
Server:Apache

В заголовке Content-Type отсутствует оператор charset.Если вы можете изменить это, то это должно работать.

РЕДАКТИРОВАТЬ: Если вы не можете изменить это, вам нужно жестко закодировать кодировку как второй аргумент InputStreamReader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...