Есть ли в Java методы для получения различных меток порядка байтов?

Я ищу служебный метод или константу в Java, которая вернет мне байты, соответствующие соответствующей метке порядка байтов для кодировки, но я не могу ее найти. Есть ли один? Я действительно хотел бы сделать что-то вроде:

byte[] bom = Charset.forName( CharEncoding.UTF8 ).getByteOrderMark();

Где CharEncoding происходит от Apache Commons.


person Brandon DuRette    schedule 02.04.2009    source источник
comment
взгляните на stackoverflow.com/questions/1835430/   -  person Gregory Pakosz    schedule 23.02.2010


Ответы (5)


Java не распознает метки порядка байтов для UTF-8. См. ошибки 4508058 и 6378911.

Суть в том, что поддержка была добавлена, нарушена обратная совместимость и откат. Вам придется самостоятельно распознавать спецификацию в UTF-8.

person Adam Jaskiewicz    schedule 21.04.2009

Apache Commons IO содержит то, что вы ищете, см. org.apache.commons.io.ByteOrderMark.

person Chris Carcel    schedule 13.09.2012

Вы можете создать спецификацию следующим образом:

byte[] utf8_bom = "\uFEFF".getBytes("UTF-8");
byte[] utf16le_bom = "\uFEFF".getBytes("UnicodeLittleUnmarked");

Если вы хотите создать спецификации для других кодировок с помощью этого метода, убедитесь, что вы используете версию кодировки, которая не вставляет спецификацию автоматически, иначе она будет повторяться. Этот метод применим только к кодировкам Unicode и не даст значимых результатов для других кодировок (например, для Windows-1252).

person McDowell    schedule 03.04.2009
comment
В моем конкретном случае я записываю файл CSV в кодировке UTF-8. Насколько я могу судить, спецификация UTF-8 — единственный способ убедить Excel не пытаться читать файл в кодировке символов по умолчанию. - person Brandon DuRette; 03.04.2009
comment
Не существует метода util, который поможет вам с вашим файлом Excel, но запись 0xEF 0xBF 0xBF в ваш OutputStream не должна быть проблемой. Просто сбросьте эти байты перед переносом потока в модуль записи с кодировкой UTF-8. - person McDowell; 05.04.2009
comment
Я бы не сказал, что часто задаваемые вопросы не одобряют его использование. Это правда, что спецификация UTF-8 не указывает метку порядка байтов (что делает ее несколько неправильным), но это определенно помогает указать, что поток использует кодировку UTF-8. - person Dan Breslau; 21.04.2009
comment
Это справедливое замечание - я обновил пост. Я не могу отделаться от ощущения, что они использовали услугу, не используя ее: blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx - person McDowell; 21.04.2009

Насколько я вижу, в JDK ничего нет, как и в проектах Apache.

Однако Eclipse EMF имеет Enum, который обеспечивает поддержку:

org.eclipse.emf.ecore.resource.ContentHandler.ByteOrderMark

Я не уверен, поможет ли это вам?

Здесь есть дополнительная информация о различных спецификациях для каждого типа кодирования, вы можете написать простой вспомогательный класс или перечисление для этого...

http://mindprod.com/jgloss/bom.html

Надеюсь, это поможет. Честно говоря, я удивлен, что этого нет в Commons I/O.

person Jon    schedule 03.04.2009
comment
Теперь он там: commons.apache.org /io/apidocs/org/apache/commons/io/input/ - person rescdsk; 12.09.2011

Стоит отметить, что многие кодировки не используют метки порядка следования байтов. например пустая строка в UTF-8 — это просто пустой байт[]. Хотя для UTF-8 указана спецификация, она редко используется в Java и не всегда поддерживается.

person Peter Lawrey    schedule 03.04.2009
comment
Понижено, потому что это кажется неправильным, как написано. Трехбайтовая последовательность байтов, содержащая спецификацию UTF-8 (EFBBBF), будет интерпретироваться как пустая строка UTF-8, если приложение понимает, как обрабатывать спецификации. (И если это не так, спецификация вызовет проблемы, пустая строка или нет.) - person Dan Breslau; 21.04.2009
comment
Java не понимает спецификации для UTF-8. Я видел, как людей это раздражало (текстовый редактор решил добавить спецификацию, javac вырвало). - person Adam Jaskiewicz; 22.04.2009
comment
Ответ Питера неверен, см. en.wikipedia.org/wiki/ - person t0r0X; 20.02.2013