首页 > 解决方案 > 编辑后如何在 xml 文件中保留重音符号?

问题描述

我正在尝试修改 xml 配置文件中的一个属性值,但是当我保存它时,重音被替换:ô => ô

这是我的代码

    $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>

标签: xmlpowershelldiacritics

解决方案


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

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

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

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

    • 因此,请Get-Content使用[xml]类型的.Load()方法来读取文件,而不是 ,它尊重 XML 声明中指定的编码:

$file = 'C:\MesInterface.config'

$xmlDoc = New-Object xml

$xmlDoc.Load($file)

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

$xmlDoc.Save($file)

推荐阅读