在正确的日语XML中得到 "十六进制值0x3C,是无效的属性字符"。

问题描述 投票:0回答:1

所有,我越来越

十六进制值0x3C,是一个无效的属性字符。

在电脑上读取XML文件时出现错误,文件中的文字是日文,而且是日文。

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

在XML中的特定位置是相当温和的。

<Control type="select">

据我所知,几乎所有类似的错误都是由字符串中的"< "引起的。所以我检查了我的XML,没有看到任何额外的"< "在不该出现的地方。但后来我发现了一个 补丁说明 说的就是这个。

考虑以下情况 你有一台电脑 正在运行Windows Server 2012。计算机的系统地域设置被设置为日文。您在计算机上以默认设置安装了网络策略和访问服务(NPAS)服务器角色。您尝试运行最佳实践分析工具来扫描网络访问保护(NAP)组件。

听起来有点耳熟,所以我怀疑是由于日本的地理位置或由于XML的一些值中的日本字符。

文件本身的开头是这样的。

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

有什么办法吗?

xml powershell utf-8 cjk
1个回答
1
投票

在这种情况下,帮助的是在获取文件内容时明确指定编码。

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

1
投票

下面是一个如何实现这一功能的演示。 这个文件.xml有一个日语字符,用utf8无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.orgwikiUTF-8。). 三个字节总是以'1110'或'E'开头。 其他的'10'位是它的延续。

1110xxxx    10xxxxxx    10xxxxxx

Xml不会介意E3,因为它是一个a,上面有一条方格线,但是81看起来就像一个空盒子(stackoverflow不能显示它),所以它会导致一个错误。 下面是file.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                          <ã“/>..

我不知道具体如何重现op的错误,但它是这样的。

© www.soinside.com 2019 - 2024. All rights reserved.