代码之家  ›  专栏  ›  技术社区  ›  Crimp

从Excel导出后,在XML文件和PowerShell输出中发现奇怪字符:

  •  1
  • Crimp  · 技术社区  · 3 年前

    我有一个XML文件,我正试图用PowerShell读取它。然而,当我读到它时,一些XML对象的输出中有以下字符:Ã、Ã、俎、俎

    我只是从第三方下载了一个需要的XML文件,该文件在Excel中打开。然后我抓取我需要的列,并将它们粘贴到一个新的Excel工作簿中。然后用XML模式映射字段,然后将其导出为XML文件,然后用于编写脚本。

    在Excel电子表格中,我的数据 清除,但是当我导出它并运行PS脚本时,这些奇怪的字符出现在输出中。这些字符甚至在导出后出现在实际的XML文件中。我做错了什么?

    我试着用 -Encoding UTF8 ,但我对PowerShell比较陌生,不知道如何将其适当地应用到我的脚本中。谢谢你的帮助!

    动力壳

    $xmlpath = 'Path\To\The\File.xml'
    
    [xml]$xmldata = (Get-Content $xmlpath)
    
    $xmldata.applications.application.name
    

    输出示例

    ​ABC_DEF_GHI​.com​​
    ​JKL_MNO_PQRS​.com​
    TUV_WXY_Z.com
    AB_CD_EF_GH​.com
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   mklement0    3 年前

    这是一个很好的例子,说明了为什么你不应该使用这个成语 [xml]$xmldata = (Get-Content $xmlpath) -尽管很方便。 [1] 问题确实在于字符编码:您的文件是UTF-8编码的,但Windows PowerShell是 Get-Content cmdlet在没有BOM的情况下将其解释为ANSI编码- this answer 详细解释了编码部分。 谢谢 choroba .

    相反 以确保正确解释XML文件的字符编码 ,请使用以下命令:

    ($xmlData = [xml]::new()).Load((Convert-Path $xmlPath))
    

    这会将字符编码的解释委托给 System.Xml.XmlDocument.Load .NET API方法,该方法不仅假定XML(UTF-8)具有适当的默认值,而且还尊重作为XML声明一部分的任何显式编码规范(如果存在)(例如。,
    <?xml version="1.0" encoding="iso-8859-1"?> )

    另见:


    [1] 如果你 碰巧知道 提前对输入文件进行编码,您可以 未受惩罚 使用 获取内容 是的 -Encoding 原始方法中的参数( [xml]$xmldata = (Get-Content -Encoding utf8 $xmlpath ),但是 .Load() -基于数据的方法更加健壮。