Подтвердить что ты не робот

Что такое XML-спецификация и как ее обнаружить?

Что такое спецификация в XML-документе ANSI и должна ли быть удалена? Должен ли XML-документ быть в UTF-8? Может ли кто-нибудь сказать мне метод Java, который обнаружит спецификацию? Спецификация состоит из символов EF BB BF.

4b9b3361

Ответ 1

Для XML файла ANSI его необходимо удалить. Если вы хотите использовать UTF-8, вам это действительно не нужно. Только для UTF-16 и UTF-32 требуется.

Знак байта-ордера (или спецификация) - это специальный маркер, добавленный в начало кодированного файла Юникода в UTF-8, UTF-16 или UTF-32. Это использовано чтобы указать, использует ли файл бай-ины или байт-байта заказ. Спецификация обязательна для UTF-16 и UTF-32, но это необязательно для UTF-8.

Относительно вопроса о том, как обнаружить это в java.

Проверьте следующий ответ на этот вопрос: Java: Как определить правильную кодировку кодировки потока, и если вы сейчас хотите определить спецификацию самостоятельно (на вашем собственный риск) проверьте, например, этот код Совет по Java: как читать файл и автоматически указывать правильную кодировку.

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

Ответ 2

Знак байтового байта, вероятно, будет одной из следующих последовательностей байтов:

     UTF-8 BOM: ef bb bf 
  UTF-16BE BOM: fe ff 
  UTF-16LE BOM: ff fe 
  UTF-32BE BOM: 00 00 fe ff 
  UTF-32LE BOM: ff fe 00 00 

Это различные кодированные формы кодировки Unicode U + FEFF. Это можно выразить как литерал Java char, используя '\uFEFF' (значения Java char неявно UTF-16). Поскольку U + FEFF не в большинстве кодировок, невозможно, чтобы этот код-код BOM был закодирован ими. (Подробнее о кодировании спецификации с помощью Java здесь.)

Когда речь идет о спецификациях и XML, они являются необязательными (см. также Часто задаваемые вопросы по Unicode BOM). Обнаружение кодировки в XML является относительно простым, если кодировка указана в объявлении. Всегда убедитесь, что объявление XML (<?xml version="1.0" encoding="UTF-8"?>) соответствует кодировке, используемой для записи документа. Если вы строго придерживаетесь этого, парсеры должны иметь возможность правильно интерпретировать ваши документы. (Спецификация XML для обнаружения кодировки.)

Я защищаю кодировку как Unicode везде, где это возможно (см. также 10 заповедей Юникода). Тем не менее, XML позволяет представление любого символа Юникода с помощью эвентуальных сущностей (например, "A" может быть представлено &#x0041;), поэтому не обязательно требовать, чтобы потеря данных.

Ответ 3

Не вставляйте спецификацию в файл utf-8: если два таких файла объединены, вы получаете спецификацию в середине, которая может разорвать аппликацию, или заставить синтаксический анализатор xml исключить исключение.

Ответ 4

OP:

Может ли кто-нибудь сказать мне метод Java, который обнаружит спецификацию?

org.apache.commons.io.input.BOMInputStream Javadocs:

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