编辑xml文件后,如何在其中保留重音符号?
我试图修改xml配置文件中的一个attritube值,但当我保存它时,重音被替换:ô=>ô 这是我的密码编辑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
$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编码保存
文件(带BOM的UTF-16也是一个选项,但对于主要包含ASCII范围字符的文件来说是浪费):它确保PowerShell版本(Windows PowerShell和PowerShell[Core]v6+)正确读取文件,确保所有Unicode字符都可以表示*.ps1
- 最安全的方法是使用带BOM的UTF-8编码保存
- 由于您的XML文档具有指定其编码的XML声明-
,因此在从文件读取文档和将文档写回文件时,您应该遵循.NET的XML API来识别编码encoding=“utf-8”
- 通过使用
方法,在将文档写回文件时,您已经遵从了API,但是使用.Save()
(它对XML一无所知)进行读取意味着文件可能会被误解;具体来说,在没有UTF-8 BOM的情况下,Windows PowerShell将以ANSI编码的方式读取文件(但请注意,PowerShell[Core]v6+现在明智地默认为UTF-8)获取内容
- 因此,不要使用
,而是使用Get Content
type的方法读取文件,该方法遵循xml声明中指定的编码:[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)