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

Кодировка по умолчанию для XML - это UTF-8 или UTF-16?

Вопросы по OpenTag:

Если декларация кодировки отсутствует в документе XML (и без внешнего механизм кодирования, такой как заголовок HTTP доступен), предполагаемое кодирование XML-документа зависит от наличия Byte-Order-Mark (BOM).

Спецификация представляет собой специальный маркер Unicode в верхней части файла, который указать его кодирование. Спецификация необязательно для UTF-8.

First bytes        Encoding assumed
-----------------------------------------
EF BB BF           UTF-8
FE FF              UTF-16 (big-endian)
FF FE              UTF-16 (little-endian)
00 00 FE FF        UTF-32 (big-endian)
FF FE 00 00        UTF-32 (little-endian)
None of the above  UTF-8

Есть ли скрытое объяснение вышеприведенного абзаца?

4b9b3361

Ответ 1

Либо вы должны использовать строку типа

<?xml version="1.0" encoding="iso-8859-1" ?>

чтобы указать, какая кодировка используется. Если кодировка не указана, может присутствовать знак Byte order (BOM). Если существует спецификация для UTF-16 или UTF-32, эта кодировка используется. В противном случае UTF-8 является кодировкой. (Спецификация для UTF-8 является необязательной)

Edit

Спецификация - невидимый символ. Но нет необходимости видеть это. Приложения автоматически заботятся об этом. Когда вы используете блокнот Windows, вы можете выбрать кодировку при сохранении файла. Блокнот автоматически вставляет спецификацию в начале файла. Когда вы позже откроете файл, блокнот распознает спецификацию и использует правильную кодировку для чтения файла. Вам не нужно когда-либо изменять спецификацию, если вы это сделаете, символы могут иметь другое значение, поэтому текст будет не таким.

Я попытаюсь объяснить на примере. Рассмотрим текстовый файл, только с символами "test". Блокнот по умолчанию будет использовать ANSI-кодировку, текстовый файл будет выглядеть так, когда вы просмотрите его в hex mode:

C:\>C:\gnuwin32\bin\hexdump -C test-ansi.txt
00000000  74 65 73 74                                       |test|
00000004

(как вы видите, я использую hexdump из gnuwin32, но вы также можете использовать hex-редактор, например Frhed, чтобы увидеть это.

Перед этим файлом нет спецификации. Это было бы невозможно, потому что символ, который используется для спецификации, не существует в кодировке ANSI. (Поскольку нет спецификации, редакторы, которые не поддерживают кодировку ANSI, будут обрабатывать этот файл как UTF-8).

когда я теперь сохраняю файл как utf8, перед "тестом" вы увидите 3 дополнительных байта (спецификация):

C:\>C:\gnuwin32\bin\hexdump -C test-utf8.txt
00000000  ef bb bf 74 65 73 74                              |test|
00000007

(если вы откроете этот файл текстовым редактором, который не поддерживает utf-8, вы действительно увидите эти символы "ï" ¿")

Блокнот также может сохранять файл как unicode, это означает, что UTF-16 мало-endian (UTF-16LE):

C:\>C:\gnuwin32\bin\hexdump -C test-unicode.txt
00000000  ff fe 74 00 65 00 73 00  74 00                    |ÿþt.e.s.t.|
0000000a

И вот версия, сохраненная как unicode (big endian) (UTF-16BE):

C:\>C:\gnuwin32\bin\hexdump -C test-unicode-big-endian.txt
00000000  fe ff 00 74 00 65 00 73  00 74                    |þÿ.t.e.s.t|
0000000a

Теперь рассмотрим текстовый файл с четырьмя китайскими символами "琀 攀 猀 琀" . Когда я сохраняю это как unicode (big endian), результат выглядит следующим образом:

C:\>C:\gnuwin32\bin\hexdump -C test2-unicode-big-endian.txt
00000000  fe ff 74 00 65 00 73 00  74 00                    |þÿt.e.s.t.|
0000000a

Как вы видите, слово "тест" в UTF-16LE хранится так же, как слово "琀 攀 猀 琀" в UTF-16BE. Но поскольку спецификация, если она хранится по-разному, вы можете увидеть, содержит ли файл "тест" или "琀 攀 猀 琀" . Без спецификации вам придется угадать.

Ответ 2

У меня вопрос, является ли это порядковый номер UTF-16 с прямым порядком байтов или UTF-16 с прямым порядком байтов?

<?xml version="1.0" encoding="UTF-16"?>
<tag/>