Страницы

Поиск по вопросам

вторник, 19 марта 2019 г.

На что влияет charset?

Я получаю файл вот кусок функции
while ((bytesRead = is.read(data)) > 0) { try { sb.append(new String(data, 0, bytesRead, charset)); } catch (UnsupportedEncodingException e) { Log.e(MY_LOG, "Invalid charset: " + e); //Append without charset (uses system's default charset) sb.append(new String(data, 0, bytesRead)); } }
И у меня всегда попадает в блок catch (UnsupportedEncodingException e) . Но файл записывается и все нормально...
Что означает этот charset? Я так понял это кодировка...
Но насколько страшно, что я записываю без нее?
Вот кстати метод который получает эту кодировку
String[] values = conn.getContentType().split(";"); String charset = ""; for (String value : values) { value = value.trim(); if (value.toLowerCase().startsWith("charset=")) { charset = value.substring("charset=".length()); break; } }
Я так понял, что если сервер передал мне файл с кодировкой, то я ее прочитываю и записываю файл с той же кодировкой...


Ответ

Что означает этот charset? Я так понял это кодировка...
Вы правильно поняли что charset отвечает за то как раскодировать последовательность байтов в символы. В общем случае, из одного и того же же байт массива используя разные кодировки, вы получите разные строки. Вот, кстати, пример проблеммы при использовании неверной кодировки.
Но насколько страшно, что я записываю без нее?
На столько-же на сколько страшно что в результате ваш текст будет состоять например из одних ? - символ которым в некотрых кодировках заменяются все символы отсутствующие в кодировке.
Но файл записывается и все нормально...
Скорее всего ваша система использует windows-1251 которая знает русские и аеглийские символы так что ваш файл раскодируется корректно. Но это скорее совпадение. Ваш код вряд ли будет работать для файла с китайскими символами.
Вот еще: получить charset по умолчанию для вашей JVM можно если выполнить
Charset.defaultCharset()

Комментариев нет:

Отправить комментарий