Проблема с UTF-8 String и двоичными данными - PullRequest
0 голосов
/ 16 июля 2010

предыстория: Регулярное выражение Java для двоичной строки

Я могу извлечь подстроку с необходимыми мне двоичными данными, но когда я использую

   String s = matcher.group(1);

Кажется, чтоданные испорчены,
, если быть точным, это только те символы, которые относятся к расширенной таблице ASCII, вероятно, от 128 до 255. Другие символы остаются без изменений, но некоторые повреждены.Я имею в виду, что мне нужно преобразовать эту строку "s" в байтовый массив, но это: String s2 = new String (s.getBytes (), "US-ASCII")

или this

String s2 = new String(s.getBytes(), "ISO-8859-1") 

и позже,

 fileOutputStream.write(s2.getBytes())

заменяет все символы из расширенной таблицы ASCII на "?", В то время как другие, такие как \ 0 или 'A', остаются не поврежденными.

Как интерпретировать строку как простые [0-255] двоичные символы ascii?

PS Я решил, нужно использовать

    String encoding = "ISO-8859-1";

для кодирования / декодирования байтовых массивов, и все работаетидеально.

Ответы [ 3 ]

1 голос
/ 16 июля 2010

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

Ответ на этот вопрос напрямую:

byte[] array = Charset.forName("utf-8").encode(CharBuffer.wrap(s)).array();

Edit:
В строку добавлена ​​вспомогательная функция, которая делает то же самое, что и выше, с немного меньшим количеством кода:

byte[] array = s.getBytes(Charset.forName("utf-8"));
1 голос
/ 11 мая 2011

Вы также можете сделать это с немного меньшим количеством кода, чем показало нам Gunslinger47

byte[] utf8Bytes = s.getBytes("UTF8");
1 голос
/ 16 июля 2010

Java знает только общие строки Unicode.Всякий раз, когда вы заботитесь о значениях байтов, лежащих в основе байтов, вы имеете дело с байтами и должны использовать байтовые массивы.Вы можете конвертировать Java Strings только в байтовые массивы для определенной кодировки (это может быть неявный аргумент по умолчанию, но он всегда есть).Вы НЕ МОЖЕТЕ использовать тип данных String и ожидать, что ваша конкретная кодировка будет сохранена, вы действительно должны указывать ее каждый раз, когда читаете данные из-за пределов Java или экспортируете их в другое место (например, в текстовые поля или файловую систему).

Использование байтовых массивов означает, что вы не можете напрямую использовать встроенную поддержку Java для регулярных выражений.Это своего рода боль, но, как вы видели, она все равно не даст правильных результатов, и это не случайность - она ​​НЕ МОЖЕТ работать правильно для того, что вы хотите сделать.Вы действительно должны использовать что-то еще для манипулирования потоками байтов, потому что String s не зависят от кодировки и всегда будут.

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