Цитата:
Цитата Uragan66
функцией полной транслитерации »
|
если говорить о полной транслитерации... то требуется реализация и обратного действия...
По-моему, уже где-то здесь на форуме было, но сейчас не могу найти, вот:
Код:
# .\script.ps1 'АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ - абвгдеёжзиклмнопрстуфхцчшщъыьэюя'
# .\script.ps1 'ABVGDEYOZHZIKLMNOPRSTUFXCCHSHSHH``Y``E`YUYA - abvgdeyozhziklmnoprstufxcchshshh``y``e`yuya' -rev
# ГОСТ 7.79-2000 тип Б ( https://ru.wikipedia.org/wiki/ISO_9 , http://docs.cntd.ru/document/1200026226 )
# Скрипт оптимизирован 24.04.20г. на предмет скорости выполнения. Заменен способ формирования основного массива,
# теперь используется system.text.stringbuilder
[cmdletbinding()]
param(
[parameter(mandatory=$true,valuefrompipeline=$true)]
[allowemptystring()]
[allownull()]
[string[]]$string,
[switch]$reverse
)
function translit {
param(
[parameter(mandatory=$true,valuefrompipeline=$true)]
[allowemptystring()]
[allownull()]
[string]$fstring
)
begin {
$arr1 = @(
'8979','89111','121111','9072','90104','122104','6790','67122','99122','6772',
'67104','99104','8372','83104','115104','837272','83104104','115104104','9696','8996',
'12196','6996','10196','8985','89117','121117','8965','8997','12197'
)
$charr = @{
[char]'А' = 'A'
[char]'а' = 'a'
[char]'Б' = 'B'
[char]'б' = 'b'
[char]'В' = 'V'
[char]'в' = 'v'
[char]'Г' = 'G'
[char]'г' = 'g'
[char]'Д' = 'D'
[char]'д' = 'd'
[char]'Е' = 'E'
[char]'е' = 'e'
[char]'Ё' = 'YO'
[char]'ё' = 'yo'
[char]'Ж' = 'ZH'
[char]'ж' = 'zh'
[char]'З' = 'Z'
[char]'з' = 'z'
[char]'И' = 'I'
[char]'и' = 'i'
[char]'Й' = 'J'
[char]'й' = 'j'
[char]'К' = 'K'
[char]'к' = 'k'
[char]'Л' = 'L'
[char]'л' = 'l'
[char]'М' = 'M'
[char]'м' = 'm'
[char]'Н' = 'N'
[char]'н' = 'n'
[char]'О' = 'O'
[char]'о' = 'o'
[char]'П' = 'P'
[char]'п' = 'p'
[char]'Р' = 'R'
[char]'р' = 'r'
[char]'С' = 'S'
[char]'с' = 's'
[char]'Т' = 'T'
[char]'т' = 't'
[char]'У' = 'U'
[char]'у' = 'u'
[char]'Ф' = 'F'
[char]'ф' = 'f'
[char]'Х' = 'X'
[char]'х' = 'x'
[char]'Ц' = 'C'
[char]'ц' = 'c'
[char]'Ч' = 'CH'
[char]'ч' = 'ch'
[char]'Ш' = 'SH'
[char]'ш' = 'sh'
[char]'Щ' = 'SHH'
[char]'щ' = 'shh'
[char]'Ъ' = '``'
[char]'ъ' = '``'
[char]'Ы' = 'Y`'
[char]'ы' = 'y`'
[char]'Ь' = '`'
[char]'ь' = '`'
[char]'Э' = 'E`'
[char]'э' = 'e`'
[char]'Ю' = 'YU'
[char]'ю' = 'yu'
[char]'Я' = 'YA'
[char]'я' = 'ya'
}
$revcharr = @{
[char]'A' = 'А'
[char]'a' = 'а'
[char]'B' = 'Б'
[char]'b' = 'б'
[char]'V' = 'В'
[char]'v' = 'в'
[char]'G' = 'Г'
[char]'g' = 'г'
[char]'D' = 'Д'
[char]'d' = 'д'
[char]'E' = 'Е'
[char]'e' = 'е'
$(-join [int[]][char[]]'YO') = 'Ё' <#89-79#>
$(-join [int[]][char[]]'Yo') = 'Ё' <#89-111#>
$(-join [int[]][char[]]'yo') = 'ё' <#121-111#>
$(-join [int[]][char[]]'ZH') = 'Ж' <#90-72#>
$(-join [int[]][char[]]'Zh') = 'Ж' <#90-104#>
$(-join [int[]][char[]]'zh') = 'ж' <#122-104#>
[char]'Z' = 'З'
[char]'z' = 'з'
[char]'I' = 'И'
[char]'i' = 'и'
[char]'J' = 'Й'
[char]'j' = 'й'
[char]'K' = 'К'
[char]'k' = 'к'
[char]'L' = 'Л'
[char]'l' = 'л'
[char]'M' = 'М'
[char]'m' = 'м'
[char]'N' = 'Н'
[char]'n' = 'н'
[char]'O' = 'О'
[char]'o' = 'о'
[char]'P' = 'П'
[char]'p' = 'п'
[char]'R' = 'Р'
[char]'r' = 'р'
[char]'S' = 'С'
[char]'s' = 'с'
[char]'T' = 'Т'
[char]'t' = 'т'
[char]'U' = 'У'
[char]'u' = 'у'
[char]'F' = 'Ф'
[char]'f' = 'ф'
[char]'X' = 'Х'
[char]'x' = 'х'
[char]'C' = 'Ц'
$(-join [int[]][char[]]'CZ') = 'Ц' <#67-90#>
$(-join [int[]][char[]]'Cz') = 'Ц' <#67-122#>
[char]'c' = 'ц'
$(-join [int[]][char[]]'cz') = 'ц' <#99-122#>
$(-join [int[]][char[]]'CH') = 'Ч' <#67-72#>
$(-join [int[]][char[]]'Ch') = 'Ч' <#67-104#>
$(-join [int[]][char[]]'ch') = 'ч' <#99-104#>
$(-join [int[]][char[]]'SH') = 'Ш' <#83-72#>
$(-join [int[]][char[]]'Sh') = 'Ш' <#83-104#>
$(-join [int[]][char[]]'sh') = 'ш' <#115-104#>
$(-join [int[]][char[]]'SHH') = 'Щ' <#83-72-72#>
$(-join [int[]][char[]]'Shh') = 'Щ' <#83-104-104#>
$(-join [int[]][char[]]'shh') = 'щ' <#115-104-104#>
#[char]'' = 'Ъ'
$(-join [int[]][char[]]'``') = 'ъ' <#96-96#>
$(-join [int[]][char[]]'Y`') = 'Ы' <#89-96#>
$(-join [int[]][char[]]'y`') = 'ы' <#121-96#>
#[char]'`' = 'Ь'
[char]'`' = 'ь'
$(-join [int[]][char[]]'E`') = 'Э' <#69-96#>
$(-join [int[]][char[]]'e`') = 'э' <#101-96#>
$(-join [int[]][char[]]'YU') = 'Ю' <#89-85#>
$(-join [int[]][char[]]'Yu') = 'Ю' <#89-117#>
$(-join [int[]][char[]]'yu') = 'ю' <#121-117#>
$(-join [int[]][char[]]'YA') = 'Я' <#89-65#>
$(-join [int[]][char[]]'Ya') = 'Я' <#89-97#>
$(-join [int[]][char[]]'ya') = 'я' <#121-97#>
}
}
process {
$arr = new-object system.text.stringbuilder
if($reverse){
$f2,$f3,$j,$m = $true,$true,0,0
$cnt = $fstring.tochararray().length
$arrtmp = $fstring.tochararray()
for($i=0;$i -lt $cnt;$i++){
if ($f2 -and $f3 -and $arr1 -match "^$([int][char]$arrtmp[$i])") {
if (($i+2) -lt $cnt){
for ($k=0;$k -le 2;$k++){
[string]$str += "$([int][char]$arrtmp[($i+$k)])"
}
if ($arr1 -contains $str){$f3 = $false}
$str = $null
}
if (($i+1) -lt $cnt -and $f3){
for ($l=0;$l -le 1;$l++){
[string]$str += "$([int][char]$arrtmp[($i+$l)])"
}
if ($arr1 -contains $str){$f2 = $false}
$str = $null
}
}
if (!$f3){
[string]$str += "$([int][char]$arrtmp[$i])";$j++
if ($j -ge 3){
$f3 = $true;$j = 0
$null = $arr.append($revcharr[$str])
$str = $null
}
} elseif (!$f2){
[string]$str += "$([int][char]$arrtmp[$i])";$m++
if ($m -ge 2){
$f2 = $true;$m = 0
$null = $arr.append($revcharr[$str])
$str = $null
}
} else {
if ($revcharr[$arrtmp[$i]] -cne $null){
$null = $arr.append($revcharr[$arrtmp[$i]])
} else {
$null = $arr.append($arrtmp[$i])
}
}
}
$null = $arr.append("`n")
} else {
foreach ($item in $fstring.tochararray()){
if ($charr[$item] -cne $null){
$null = $arr.append($charr[$item])
} else {
$null = $arr.append($item)
}
}
$null = $arr.append("`n")
}
}
end {$arr.tostring().trim("`n")}
}
$string|translit
|