кодировка строк в Java

228
28 января 2018, 02:41

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

  String data = "Текст который получаю";
  data = new String (arr.getBytes ("utf8"), "utf8" );

Но после услышал критики что это типа не правильно. И вот на какие вопросы я хотел бы услышать ответ: 1. Правильно ли я все понял? 2. Правильно ли я реализую это в коде? Заранее спасибо

Answer 1

Кодировка это просто таблица, где каждой букве соответсвует число (помним же, что компьютер хранит только числа?). Поэтому кодировка имеет смысл только в том случае когда массив чисел (byte[], например) нам нужно превратить в строку и нужно понимать с какой буквой ассоциировать каждое число (ну или в обратную сторону).

Таким образом кодировка имеет смысл только при преобразовании в массив байтов или наоборот. Ваша запись в сокет это оно и есть.

Грубо говоря вы прочитали из сокета массив байтов:

byte[] data = socket.read();

Дальше нам нужно этои числа интрпретировать как строку, с правильной таблицей (кодировкой). В этом случае кодировка показывают в какую букву будет преобразовано каждое число:

new String(data, "UTF-8");

И наоборот у нас есть строка, и мы хотим преобразовать её к массиву байтов, мы указываем кодировку, то бишь в какое число будет преобразована каждая буковка:

String data = "abc";
byte[] array = data.getBytes("UTF-8");
socket.write(array);

Если у вас проблемы с русскими буквами - значит скорее всего указали неправильную кодировку. Какую нужно указывать - нужно разбирать что вам собственно приходит из сокета.

READ ALSO
Unable to merge dex

Unable to merge dex

Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'

387
Как в андроид сделать кнопку-список (без ActionBar)?

Как в андроид сделать кнопку-список (без ActionBar)?

Коротко о проблеме: Есть кнопка

172
Вывести наименьшее Y, при котором возможно получить Z [требует правки]

Вывести наименьшее Y, при котором возможно получить Z [требует правки]

Есть задачаМы можем делать следующие действия:

186
Переход на другую активность

Переход на другую активность

Есть код, который передает отмеченные позиции в listView в другую активность:

249