У меня следующая проблема: представьте, что у меня есть файл UTF8, в котором каждый специальный символ обозначен символом REPLACEMENT_CHARACTER «�». Некоторая часть файла может выглядеть так:
Das hier r�ckg�ngig ist das zu machen r�ckg�ngig: ist bereits geamcht Weitere W�rter gibt ers zu korrigieren Hier noch ein bl �des Wort zwei in einer Zeile Gühte und Gr��e
Я написал сценарий PowerShell, который заменяет REPLACEMENT_CHARCTERS соответствующими специальными символами, например "a", "ü" или " ß ". Исправленный текст, также UTF8, будет выглядеть следующим образом:
Das hier rückgängig ist das zu machen rückgängig: ist bereits geamcht Weitere Wörter gibt ers zu korrigieren Hier noch ein blödes Gröteer und zu
Проблема в том, что программа, в которую я хочу импортировать текст, принимает только файлы в кодировке «Wester European DOS (CP850)». Кстати, это была исходная кодировка, которую программа была экспортирована и импортировала бы без проблем, если бы я не открыл файл, не отредактировал его и не сохранил в UTF8. Итак, вот что произошло:
Я экспортировал файлы из специальной c программы как «Wester European DOS (CP850)». [Примечание: каждый специальный символ здесь имеет свой собственный ЗАМЕНА ЗНАЧЕНИЯ, поэтому импорт будет работать легко и восстановить специальные символы]
Я открыл файл с помощью редактора по своему выбору и редактора обнаружил "UTF8" сам по себе, что неверно. Не узнал, отредактировал файл и сохранил как UTF8. [Теперь каждый специальный символ имеет один и тот же СИМВОЛ ЗАМЕНЫ, его �]
Я обнаружил, что что-то не так, и написал сценарий, который заменяет каждое вхождение � правильным специальным символом в UTF8. [Думаю, не имеет значения, как это делает сценарий, но если да, спросите]
У меня есть исправленный файл UTF8, но, как вы помните, мне нужно импортировать "западноевропейскую DOS" (CP850) "в мою программу. Та же кодировка файла, что и при экспорте файла. Эта кодировка гарантирует, что каждый специальный символ имеет свой собственный уникальный REPLACEMENT_CHARACTER. Итак, как мне вернуться к этому с помощью PowerShell?
Вот еще некоторая информация. Строка, в которой скрипт считывает файл, который я хочу исправить:
$lines = get-content $file -encoding utf8 | select-string $SearchCharacter
Алгоритм проходит через каждую строку и запрашивает любое неправильное слово с символом для исправления и пропускает его, если оно найдено. очередной раз. После того, как все исправления во всех файлах были найдены, он заменяет в al oop вхождения каждого «ключа» (неправильного слова) на каждое «значение» (исправленное слово) в каждом файле на эту строку:
foreach key ...
(Get-Content -encoding utf8 $file) -replace "$key", "$value" | Set-Content -encoding utf8 $file
Я уже пробовал сделать что-то подобное:
foreach key ...
(Get-Content -encoding utf8 $file) -replace "$key", "$value" | Set-Content -encoding OEM $file
Но это приводит к использованию "?" вместо правильного символа:
Das hier r? ckg? ngig ist das zu machen r? ckg? ngig: ist bereits geamcht Weitere W? rter gibt ers zu korrigieren Hier noch ein bl? des Wort zwei в einer Zeile G? hte und Gr ?? e
Есть предложения, как я могу создать файл "Wester European DOS (CP850)" из UTF8?
EDIT:
Эта функция, полученная из http://www.msdynamics.de/viewtopic.php?f=17&t=25726#p138532, решила мою проблему:
Function ConvertAndReplace_UTF8_OEM850
{
Param ([String]$path)
$path = resolve-path $path
$sourceEncoding = [System.Text.Encoding]::GetEncoding(65001)
$targetEncoding = [System.Text.Encoding]::GetEncoding(850)
$textfile = [System.IO.File]::ReadAllText($path, $sourceencoding)
[System.IO.File]::WriteAllText($path, $textfile, $targetencoding)
Write-host "Content in $path converted from UTF-8 to OEM850"
}