编辑xml文件后,如何在其中保留重音符号?

编辑xml文件后,如何在其中保留重音符号?,xml,powershell,diacritics,Xml,Powershell,Diacritics,我试图修改xml配置文件中的一个attritube值,但当我保存它时,重音被替换:ô=>ô 这是我的密码 $xmlDoc = [XML](Get-Content "C:\MesInterface.config") $xmlDoc.configuration.ContrôleFlan.lastId = "0" $xmlDoc.Save("C:\MesInterface.config") 保存之后会发生什么 &l

我试图修改xml配置文件中的一个attritube值,但当我保存它时,重音被替换:ô=>ô

这是我的密码

    $xmlDoc = [XML](Get-Content "C:\MesInterface.config")
    $xmlDoc.configuration.ContrôleFlan.lastId = "0"
    $xmlDoc.Save("C:\MesInterface.config")
保存之后会发生什么

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<ContrôleFlan lastId="0"/></configuration>

如果要为XML设置代码编码,可以执行以下操作:

$settings = New-Object System.Xml.XmlWriterSettings
$settings.Encoding = [System.Text.Encoding]::Unicode

$writer = [System.Xml.XmlWriter]::Create("c:\test\mydata.xml", $settings);

$xmlDoc.Save($writer)

$writer.Close()

一般建议在涉及国际字符时,将编码为UTF-8
.ps1
文件与BOM
一起保存

Powershell v5.1及更早版本假定在代码页中编码没有BOM(字节顺序标记)的
.ps1
文件。从:

没有BOM表时,PowerShell 5.1及以下版本默认为Windows-1252编码。
出于互操作性的原因,最好将脚本保存为带有BOM表的Unicode格式

[编辑]正如@mklement0在评论中(和微软)指出的那样,上述引用的官方文件似乎是错误的。PowerShell通常默认为系统范围的默认值,但不一定是Windows-1252。[结束编辑]

OP在评论中写道:

[ps1文件]已经用UTF8编码,我已经切换到ANSI,现在我的XML是正确的

这在本例中起作用,因为字符
ô
恰好存在于Windows-1252(ANSI)代码页中

但是,将
.ps1
文件保存为ANSI仍然会导致它在Windows-1252代码页之外的字符中失败。例如,如果复制/粘贴到使用ANSI编码保存的
.ps1
文件,则以下操作将失败,但如果使用BOM保存为UTF-8,则以下操作将有效

    $xmlDoc = [XML](Get-Content "C:\MesInterface.config")
    $xmlDoc.configuration.ContrôleFlan.lastId = "αß©∂€"
    $xmlDoc.Save("C:\MesInterface.config")

有两个最终独立的方面需要考虑:

  • 如果脚本文件本身包含(与代码相关的)非ASCII字符,如
    ô
    ,则必须确保PowerShell引擎正确解释这些字符

    • 最安全的方法是使用带BOM的UTF-8编码保存
      *.ps1
      文件(带BOM的UTF-16也是一个选项,但对于主要包含ASCII范围字符的文件来说是浪费):它确保PowerShell版本(Windows PowerShell和PowerShell[Core]v6+)正确读取文件,确保所有Unicode字符都可以表示
  • 由于您的XML文档具有指定其编码的XML声明-
    encoding=“utf-8”
    ,因此在从文件读取文档和将文档写回文件时,您应该遵循.NET的XML API来识别编码

    • 通过使用
      .Save()
      方法,在将文档写回文件时,您已经遵从了API,但是使用
      获取内容
      (它对XML一无所知)进行读取意味着文件可能会被误解;具体来说,在没有UTF-8 BOM的情况下,Windows PowerShell将以ANSI编码的方式读取文件(但请注意,PowerShell[Core]v6+现在明智地默认为UTF-8)

    • 因此,不要使用
      Get Content
      ,而是使用
      [xml]
      type的方法读取文件,该方法遵循xml声明中指定的编码:


您的PowerShell代码肯定在ps1文件中。检查ps1文件的编码是否为UTF-8。@mundopter它已经是UTF8编码的,我已经切换到AINSI,现在我的XML是正确的。非常感谢。
$file = 'C:\MesInterface.config'

$xmlDoc = New-Object xml

$xmlDoc.Load($file)

$xmlDoc.configuration.ContrôleFlan.lastId = "0"

$xmlDoc.Save($file)