Краткий ответ: Да, кодировка является виновником; правильная кодировка - utf-16.
Длинный ответ: подсказка лежит в тексте исключения, где написано «шестнадцатеричное значение 0xA000D» и «строка 1, позиция 40».
Когда XmlReader читает ваш файл, он сначала читает декларацию XML (все между <?xml
и ?>
), чтобы определить, какую кодировку использовать для остальной части файла. В этом случае в декларации говорится UTF-32. Поэтому сразу после прочтения символа >
в конце объявления он переключается на использование кодировки UTF-32. Как объясняется в вашей статье, UTF-32 использует 4 байта для представления каждого символа, поэтому XmlReader считывает следующие 4 байта из файла и пытается интерпретировать их как символ. (Это соответствует вашему сообщению об ошибке, поскольку позиция 1 в строке 40 находится сразу после символа >
.)
Если бы файл действительно был UTF-32, какими были бы следующие 4 байта? Ну, следующая вещь в файле после символа >
- это новая строка, состоящая из двух символов, возврата каретки и перевода строки (в Unicode, 0D и 0A соответственно). Таким образом, мы ожидаем, что следующие 4 байта будут 0D 00 00 00, а следующие 4 байта будут 0A 00 00 00 (помните, что Windows * little-endian ).
Но, как говорится в сообщении об ошибке, фактическим считыванием «символа» было A000D, что означает, что следующие 4 байта были 0D 00 0A 00 (опять же, помните little-endian). Это довольно близко, но очевидно, что для каждого символа вместо 4 используются только 2 байта. Ну, у нас есть название для этого, не так ли? Это называется UTF-16!