Что такое спецификация в XML-документе ANSI и должна ли быть удалена? Должен ли XML-документ быть в UTF-8? Может ли кто-нибудь сказать мне метод Java, который обнаружит спецификацию? Спецификация состоит из символов EF BB BF.
Что такое XML-спецификация и как ее обнаружить?
Ответ 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" может быть представлено A
), поэтому не обязательно требовать, чтобы потеря данных.
Ответ 3
Не вставляйте спецификацию в файл utf-8: если два таких файла объединены, вы получаете спецификацию в середине, которая может разорвать аппликацию, или заставить синтаксический анализатор xml исключить исключение.
Ответ 4
OP:
Может ли кто-нибудь сказать мне метод Java, который обнаружит спецификацию?
org.apache.commons.io.input.BOMInputStream
Javadocs:
Этот класс определяет эти байты и, при необходимости, может автоматически пропустить их и вернуть следующий байт в качестве первого байта в потоке.