Получение «шестнадцатеричное значение 0x3 C, является недопустимым символом атрибута» на правильном японском языке XML - PullRequest
0 голосов
/ 29 мая 2020

Все, я получаю

шестнадцатеричное значение 0x3 C, это недопустимый символ атрибута

ошибка при попытке прочитать XML на компьютере с Японский язык и японские символы в файле:

  $xml = [xml]@(Get-Content $file)

Specifi c место в XML довольно безобидно:

<Control type="select">

Насколько я могу судить, почти каждая ошибка как это вызвано "<" где-то в строке. Я проверил свой XML и не увидел лишних «<» там, где их не должно быть. Но затем я нашел одно <a href="https://support.microsoft.com/en-us/help/2787651/error-when-you-run-the-best-practices-analyzer-tool-on-a-computer-that" rel="nofollow noreferrer"> описание исправления , в котором говорится следующее:

Рассмотрим следующий сценарий: у вас есть компьютер, на котором работает Windows Server 2012. Настройка локали системы компьютера настроен на японский язык. Вы устанавливаете роль сервера Network Policy and Access Services (NPAS) с настройками по умолчанию на компьютере. Вы пытаетесь запустить инструмент Best Practices Analyzer для сканирования компонентов защиты доступа к сети (NAP).

Звучит знакомо, так что я подозреваю, что это связано с японским языком или японскими символами в некоторых значениях для XML.

Сам файл начинается так:

<?xml version="1.0" encoding="utf-8"?>

Есть идеи?

Ответы [ 2 ]

1 голос
/ 03 июня 2020

Вот демонстрация того, как это может случиться. Этот файл. 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                          <ã“/>..

Я не знаю, как точно воспроизвести ошибку операции, но это примерно так.

1 голос
/ 30 мая 2020

В этом случае помогло явное указание кодировки при получении содержимого файла:

 $xml = [xml]@(Get-Content $file -Encoding UTF8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...