Export-Clixml 转义变量中的所有特殊字符

Export-Clixml Escape All Special Characters in Variable

我有一个 DataGrid ($myWindow.myDataGrid.Items),我正在尝试 Export-Clixml$myWindow.myDataGrid.Items 是一个 ItemCollection,它包含 String 属性,这些属性是具有特定字符的单词,例如 "C‘Thun" 或“—Hello”。要访问我当前正在查看的字符串,我键入 $myWindow.myDataGrid.Items[0].Title,这将给我字符串 "C‘Thun".

我使用的命令是:

$myWindow.myDataGrid.Items | Export-Clixml -path $path

导出时,它们会被翻译成其他字符。在notepad++中,“‘”和“—”分别显示为"x91"和"x97"。导出前我检查了数组,文本是准确的,但是导出后,我检查了XML文件,文本都被转换了。我需要保留所有原始字符。

然后我使用这个命令,将 Import-Clixml 返回到我的 DataGrid:

$Global:items = [Object[]]Import-Clixml -path $path
$myWindow.myDataGrid.ItemsSource = $Global:items

我在 $Global:items = [Object[]]Import-Clixml -path $path 处设置了一个断点,以查看导入时 $Global:items[0].title 处的值是什么,果然,它是一个 ?DataGrid 中的值也是 ?.

我使用的是 powershell 版本 4。

编辑:更改了一些细节。抱歉,添麻烦了。我在 2 个不同的系统上,无法复制和粘贴。

Export-Clixml cmdlt 中指定编码。

使用 Export-Clixml -Path $path -Encoding ASCII 应该可以解决字符存储不正确的问题,Unicode 和 UTF8 也可以作为 EncodingTypes 使用。

根据您的编辑,我认为发生的情况是某些字符正在转换为 XML 个实体。例如 — 将代替代码为 0x97.

的字符

这个你不用担心;将对象序列化为 XML 的全部意义在于将其反序列化为对象。

通过在生成的文件上使用 Import-Clixml,您应该会看到相同的对象(它不会再处于 "live" 状态;这对某些类型的对象很重要,因为它们的一部分将不再起作用。

在尝试了一切之后,在 ConnorLSW 的原始回复的帮助下,我决定更多地关注问题的编码方面,我终于找到了有效的方法!

在使用 Export-Clixml 导出 XML 文件后,我不得不手动 Get-Content 然后 Set-ContentUTF8 像这样:

Get-Content $path | Out-String | Set-Content $path -Encoding UTF8

x91x97 被转换回其原始字符,一切正常。 另外,出于某种原因,以下代码没有相同的效果,对我不起作用:

$myWindow.myDataGrid.Items | Export-Clixml -path $path -Encoding UTF8