Вот демонстрация того, как это может случиться. Этот файл. xml содержит один японский символ, закодированный в utf8 no bom:
<こ/>
Этот символ - unicode 0x3053:
[int][char]'こ' | % tostring x
3053
'こ' | format-hex -Encoding bigendianunicode
Label: String (System.String) <32532FE4>
Offset Bytes Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 30 53 0S
Powershell 5 предполагает, что файл ascii:
[xml]$xml = get-content file.xml
Cannot convert value "<ã“/>" to type "System.Xml.XmlDocument". Error: "The '' character,
hexadecimal value 0x81, cannot be included in a name. Line 1, position 3."
At line:1 char:1
+ [xml]$xml = get-content file.xml
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
Символ Unicode 0x3053 будет закодирован в utf8 как 3 байта, «E3 81 93», из-за диапазона, в который он попадает. Префиксы битов utf8 выглядят следующим образом (https://en.wikipedia.org/wiki/UTF-8). Три байта всегда начинаются с «1110» или «E». Остальные '10' битов продолжают его.
1110xxxx 10xxxxxx 10xxxxxx
Xml не возражает против E3, потому что это a с волнистой линией над ним, но 81 просто выглядит как пустой ящик (stackoverflow может не отображать его), поэтому это вызывает ошибку. Вот необработанные байты файла. xml. «0D 0A» - это просто возврат каретки и перевод строки.
format-hex file.xml -encoding utf8
Path: C:\Users\admin\foo\file.xml
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 3C E3 81 93 2F 3E 0D 0A <ã“/>..
Я не знаю, как точно воспроизвести ошибку операции, но это примерно так.