Причудливое кодирование умляута (äöü) - PullRequest
0 голосов
/ 16 сентября 2018

В настоящее время я делаю школьный проект, в котором мне нужно загрузить данные с веб-сайта (путем сканирования) и обработать / отобразить их в приложении для Android. Загруженные данные часто содержат буквы типа ä, которые безошибочно отображаются в TextView.

Иногда в данных, которые я получаю, есть пробелы, которые мой парсер заполняет после загрузки. Вместо отображения textThatContainsÄ отображается  . Легко исправить:

String data = downloadFromServer();

// Fill the gap
data = data.replace(" ", textThatContainsÄ);

Выход, как и ожидалось:

Output: [..]ä[..]

Логика, которую я написал выше, была упакована в .jar и импортирована в мое приложение для Android. Загруженные данные никак не затрагиваются приложением Android из-за инкапсуляции.

Теперь наступает поворот. Если загруженные данные с сервера НЕ изначально содержат textThatContainsÄ (так что мой анализатор должен заполнить пробел), Android интерпретирует их как textThatContainsä, что явно является проблемой кодирования UTF-8, которая вызвано обработкой UTF-8 байтов как Windows-1252 (or ISO 8859-1) байтов (Android интерпретирует текст как 21 вместо 18 байтов (размер текста 9)). Эта проблема не возникает, если данные изначально содержат ä.

Я не знаю, почему ä, сгенерированный Java-кодом, создает проблемы кодирования в Android.

Редактировать: было вызвано Gradle.

1 Ответ

0 голосов
/ 16 сентября 2018

Я выстрелил себе в ногу, используя Gradle.После некоторых исследований я обнаружил, что Gradle обычно NOT компилирует .java файлы, используя UTF-8 по умолчанию.Поэтому, когда я скомпилировал .jar, он случайно перевел ä в ä, как я мог видеть в декомпилированных .class файлах.

При добавлении кода ниже вся проблема была решена.

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...