Ответ 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. Но поскольку спецификация, если она хранится по-разному, вы можете увидеть, содержит ли файл "тест" или "琀 攀 猀 琀" . Без спецификации вам придется угадать.