Export-Clixml экранирует все специальные символы в переменной
У меня есть 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
являются также ?
,
Я на версии 4 PowerShell.
РЕДАКТИРОВАТЬ: изменил некоторые детали. Извините за беспокойство. Я нахожусь на 2 разных системах и не могу копировать и вставлять.
3 ответа
Попробовав все, с помощью оригинального ответа ConnorLSW, я решил сосредоточиться на проблеме кодирования, и, наконец, я нашел то, что сработало!
После того, как файл XML был экспортирован с Export-Clixml
Мне пришлось вручную 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
Укажите кодировку в Export-Clixml
cmdlt.
с помощью Export-Clixml -Path $path -Encoding ASCII
должны решить проблемы с неправильно сохраненными символами, Unicode и UTF8 также доступны как EncodingType
s.
Основываясь на ваших изменениях, я думаю, что некоторые символы преобразуются в объекты XML. Например —
займет место персонажа с кодом 0x97
,
Вам не нужно беспокоиться об этом; весь смысл сериализации объекта в XML состоит в том, чтобы десериализовать его обратно в объект.
Используя Import-Clixml
в сгенерированном файле вы должны увидеть один и тот же объект (он просто больше не будет находиться в "живом" состоянии; это имеет значение для некоторых типов объектов, поскольку их части просто больше не будут работать).