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 也可以作为 EncodingType
s 使用。
根据您的编辑,我认为发生的情况是某些字符正在转换为 XML 个实体。例如 —
将代替代码为 0x97
.
的字符
这个你不用担心;将对象序列化为 XML 的全部意义在于将其反序列化为对象。
通过在生成的文件上使用 Import-Clixml
,您应该会看到相同的对象(它不会再处于 "live" 状态;这对某些类型的对象很重要,因为它们的一部分将不再起作用。
在尝试了一切之后,在 ConnorLSW 的原始回复的帮助下,我决定更多地关注问题的编码方面,我终于找到了有效的方法!
在使用 Export-Clixml
导出 XML 文件后,我不得不手动 Get-Content
然后 Set-Content
到 UTF8
像这样:
Get-Content $path | Out-String | Set-Content $path -Encoding UTF8
x91
和 x97
被转换回其原始字符,一切正常。
另外,出于某种原因,以下代码没有相同的效果,对我不起作用:
$myWindow.myDataGrid.Items | Export-Clixml -path $path -Encoding UTF8
我有一个 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 也可以作为 EncodingType
s 使用。
根据您的编辑,我认为发生的情况是某些字符正在转换为 XML 个实体。例如 —
将代替代码为 0x97
.
这个你不用担心;将对象序列化为 XML 的全部意义在于将其反序列化为对象。
通过在生成的文件上使用 Import-Clixml
,您应该会看到相同的对象(它不会再处于 "live" 状态;这对某些类型的对象很重要,因为它们的一部分将不再起作用。
在尝试了一切之后,在 ConnorLSW 的原始回复的帮助下,我决定更多地关注问题的编码方面,我终于找到了有效的方法!
在使用 Export-Clixml
导出 XML 文件后,我不得不手动 Get-Content
然后 Set-Content
到 UTF8
像这样:
Get-Content $path | Out-String | Set-Content $path -Encoding UTF8
x91
和 x97
被转换回其原始字符,一切正常。
另外,出于某种原因,以下代码没有相同的效果,对我不起作用:
$myWindow.myDataGrid.Items | Export-Clixml -path $path -Encoding UTF8