Специальные символы отображаются в виде хэшей вопросительных знаков - PullRequest
1 голос
/ 26 октября 2011

Я занимаюсь разработкой приложений для устройств Android, и в последнее время у меня возникла проблема при разработке.

Мне нужно было получить информацию из html-файла в Интернете, поэтому я создал конструкцию InputStream и BufferedReader для фактического сканирования.файл для информации.Я разделил свою строку, чтобы фактически получить информацию, и попытался отобразить ее с помощью тоста.

Все работает нормально и так, как я хочу, но каждый раз, когда должны отображаться специальные символы, возникает хэш вопросительного знака.

Я думаю, что это может быть проблемой кодировки, потому что на веб-сайте написано:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

Как мне это правильно понять?

РЕДАКТИРОВАТЬ:

HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
((AbstractHttpClient) httpClient).getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials("user","password"));
HttpResponse response;
response = httpClient.execute(post);
BufferedReader reader = new BufferedReader(
    new InputStreamReader(
        response.getEntity().getContent()
    )
);
String line = null;
while ((line = reader.readLine()) != null) {
    Toast.makeText(this, line, Toast.LENGTH_LONG).show();
}

Ответы [ 4 ]

1 голос
/ 27 октября 2011

InputStreamReader может фактически принять Charset в качестве второго параметра, чтобы указать, я полагаю, кодировку символов потока, который он собирается прочитать. Стандартно-совместимые реализации Java не обязательно должны содержать кодировку windows-1252, но я считаю, что она очень похожа на ISO-8859-1, которую вы можете попробовать в качестве первого обходного пути, чтобы увидеть, работает ли она. Есть также еще один, возможно, интересный конструктор в классе InputStreamReader, который принимает CharsetDecoder в качестве второго параметра (вы можете создать его, вызывая Charset.newDecoder), который вы можете использовать для декодирования потока в той кодировке, которую вы предпочитаете, или, возможно, в кодировке системы по умолчанию, которую вы можете получить, вызвав Charset.defaultCharset.

Подробнее см. В документации по API JavaDoc для InputStreamReader , Charset и CharsetDecoder . На самом деле я не эксперт, и я немного знаю о кодировании и его проблемах, но я подумал, что стоит отметить наличие этих классов.

Вы также можете проверить кодировку, используемую для InputStreamReader, вызвав метод getEncoding.

0 голосов
/ 22 апреля 2014

На всякий случай, если у кого-то есть такая же проблема, как у меня ...

Я получал тот же вопросительный знак в черном ромбе для текста, который я извлек из файла JSON, загруженного из res / raw. Независимо от того, какую комбинацию потокового чтения я пробовал, символы все равно будут появляться. Моей первой попыткой убедиться, что я использую UTF-8, было проверить свойства файла через Eclipse, и достаточно точно было установлено «MacRoman», что бы это ни было. Я изменил его на UTF-8, построил, запустил, потерпел неудачу, почистил, собрал, запустил, потерпел неудачу, почесал голову, вернулся к SO.

Я прочитал, что мне пришлось сохранить файл после изменения кодировки, поэтому я попытался это сделать, но все равно не повезло. Затем я, наконец, прокрутил файл JSON в редакторе Eclipse, где находились специальные символы, и, что интересно, специальные символы (é и emdash) также показывались там как черные бриллианты! Я удалил и снова ввел их, и все работало нормально.

Итог: кодировка имеет значение, и при создании файла ресурсов (XML, JSON, CSV или любого другого) убедитесь, что вы выбрали правильную кодировку (обычно UTF-8) ДО того, как начнете вводить текст.

0 голосов
/ 27 октября 2011

о, пожалуйста, используйте utf-8 независимо от того, решена ли эта проблема в другом месте. http://www.w3.org/TR/html4/charset.html http://en.wikipedia.org/wiki/UTF-8

0 голосов
/ 26 октября 2011

Я предполагаю, что вы только что использовали конструктор InputStreamReader, который принимает поток, но не кодировку символов - поэтому он попытается использовать платформу по умолчанию.Вы должны использовать кодировку, указанную в ответе;когда вы используете HTTP, значение в заголовке Content-Type будет , вероятно, , что будет хорошо, хотя обидно, что HTML может указать его отдельно: (

Теперь, содержит ли AndroidКодировка Windows-1252 - это другое дело ...

...