Ява unicode парсинг байта

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

Каждый характер использует два байта, с только первым кажущимся, чтобы содержать фактические данные, так же например, последовательность 'доверие' сохранена в файле как:

0x74 0x00(t) 0x72 0x00(r) ...and so on

Обычно я просто использовал бы regex, чтобы ничем заменить ноли и поэтому удалить пробел. Однако места между словами в файле осуществляются, используя 0x00 0x00 , таким образом пытаясь сделать, простая строка 'replaceAll' является видом питания его немного.

Я попытался играть вокруг с наборами кодирования Последовательности, такими как 'ISO-8859-1' и 'UTF-8/16', но каждый раз я заканчиваю с пробелом.

Я действительно создавал простой regex, чтобы удалить двойные нулевые шестнадцатеричные ценности, который является:

new String(bytes).replaceAll("[\\00]{2,},"");

Но это очевидно только работает на двойной ноль, и я действительно хотел бы ничем заменить единственные ноли и двойные ноли с фактический пробел ASCII/Unicode.

Я, возможно, поклялся, что одни из Явских параметров настройки формата строки имели дело с такого рода вещью, но я мог бы быть неправым. Таким образом, я должен работать над созданием regex, чтобы раздеть ноли, или Ява на самом деле обеспечивает механизмы для того, чтобы сделать его?

Спасибо

3
nl ja de

2 ответы

Это - "UTF-16LE" . 0x00 0x00 на самом деле кодирует характер NUL в UTF-16, таким образом, это - то, что вы получите.

Это кодирование может закодировать приблизительно миллион различных знаков, используя 2 или 4 байта за характер. Первые 256 знаков закодированы со вторым байтом 0x00 и если текст только содержит тех, это могло бы быть рассмотрено как бесполезное, но это требуется для остальной части знаков. Например, европейское обозначение денежной единицы разоблачило бы как 0xAC 0x20 .

6
добавлено
Ahh да, таким образом, это, я couldn' t находят это для взгляда. That' s ответил на мой вопрос и зафиксировал его. Большое спасибо за быстрый ответ, I' щелчок ll принял, как только я могу. Спасибо Esailija!
добавлено автор Tony, источник

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

Преобразуйте их в последовательности, используя соответствующий набор символов, в этом случае UTF-16LE (UTF-16 с прямым порядком байтов, с байтом младшего разряда, сначала сопровождаемым старшим байтом)

String str = new String(bytes, "UTF-16LE");
3
добавлено
Спасибо Иэн, that' s точно, что I' ve сделан. Из интереса, what' s лучший способ определить тип unicode используемого набора символов?
добавлено автор Tony, источник
Спасибо за входных парней, очень ценивших!
добавлено автор Tony, источник
@Tony там isn' t действительно "лучший способ", если данные не начинаются с отметки порядка байтов - если первые два байта - FF FE тогда it' s UTF-16 с обратным порядком байтов, FF FE тогда it' s UTF-16 с прямым порядком байтов, EF BB BF it' s UTF-8. Но если you' ре читая двоичный формат тогда спецификация формата должно сказать вам что, кодируя (включая endianness), чтобы ожидать.
добавлено автор Ian Roberts, источник
@Tony обычно кодирование не определены, но явно сказаны. Как то, если вы получили файл от http сервера, сервер, вероятно, послал вам http заголовок, содержащий кодирование. Без этой информации автоматическое обнаружение кодирования не надежно. Вручную можно сделать лучшее предположение и видеть, выходит ли текст правильно. en.wikipedia.org/wiki/Charset_detection
добавлено автор Esailija, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async