Декодер

Простенькая функция для перекодировки текста из одной кодировки в другую.

function ConvertTo-Encoding ([string]$From, [string]$To){
	Begin{
		$encFrom = [System.Text.Encoding]::GetEncoding($from)
		$encTo = [System.Text.Encoding]::GetEncoding($to)
	}
	Process{
		$bytes = $encTo.GetBytes($_)
		$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
		$encTo.GetString($bytes)
	}
}

И на пару — для получения списка доступных кодировок:

function Get-Encodings {[System.Text.Encoding]::GetEncodings()}

Можно конечно и [s[tab].t[tab].encodi[tab]::[tab][tab] набрать, но мне показалось что в виде классической Get- функции это будет красивее🙂 (Если у вас вдруг еще не дополнется .Net по табу — см. сюда)

Функция берет строку или массив строк на вход, и в качестве параметров указываются названия исходной и нужной кодировок (см. Get-Encodings).

Например:

PS D:\PowerShell> "Проверка" | ConvertTo-Encoding windows-1251 koi8-r
рТПЧЕТЛБ
PS D:\PowerShell> "рТПЧЕТЛБ" | ConvertTo-Encoding koi8-r windows-1251
Проверка

Ну или берём строки из файла и переправляем в другой файл:

PS D:\PowerShell> Get-Content notes.txt | ConvertTo-Encoding "windows-1251" "koi8-r" | Set-Content decoded.txt

То же самое но другими буквами😉

PS D:\PowerShell> cat notes.txt | ConvertTo-Encoding "windows-1251" "koi8-r" > decoded.txt

Хотел приделать возможность указывать строку для перекодировки в качестве параметра (без «|»), но к сожалению такой финт ушами (несколько Parameter Set) можно сделать только в коммандлетах… В функциях — либо одно, либо другое😦
Впрочем потом может напишу командлет где можно будет делать и так и эдак.

Опубликовано в PowerShell. 4 комментария »

комментария 4 to “Декодер”

  1. Евгений Says:

    “Проверка” | ConvertTo-Encoding windows-1251 cp866 | ConvertTo-Encoding cp866 windows-1251 >>c:\1.txt

    В файле получаю: ?рRв?рка

    Что бы это значило?

  2. Xaegr Says:

    2 Евгений: символы пропадают уже в момент конвертации в cp866… Попробовал аналогичный код на c# — та же ситуация. Это видимо ошибка (или мы что то не понимаем?) в .Net framework. Записал в todo — сделать функцию ConvertTo-Cp866 не зависящую от .Net🙂

  3. Декодер 2cp866 « PowerShell и другие скрипты Says:

    […] Practice, Scripting — Xaegr @ 8:58 Больше года назад я написал функцию для перекодировки текста из одной кодировки в другую, с помощью функций .Net, […]

  4. veryom Says:

    Здравствуйте, Василий.

    Появилось несколько вопросов по вашему скрипту.

    1. Строка $bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes), на мой взгляд, лишняя, т.к. той же функциональности можно добиться закомментировав эту строку и изменив строку $encTo.GetString($bytes) на $encFrom.GetString($bytes).

    2. С выводом в файл тоже не очень корректно, т.к. командлет Set-Content decoded.txt запишет файл в кодировке Unicode (UCS-2 little endian) в любом случае. Для перекодировки файлов более корректная, наверное, будет такая последовательность действий: прочитать «чистые» байты, перекодировать при помощи [System.Text.Encoding]::Convert из одной кодировки в другую и записать «чистые» байты (т.е. используя параметр -encoding byte командлета set-content) обратно в файл.


Обсуждение закрыто.

%d такие блоггеры, как: