Зачем вести себя по-разному в модуле или скрипте? - PullRequest
1 голос
/ 18 июня 2019

У меня есть функция, которая заменяет умляуты.Если эта функция сохранена как обычный файл сценария (.ps1), вывод будет test-aeoeueAeOeUe1234.Это то, что я ожидаю получить: -)

function TestReplace{  
    Param(
        [parameter(Mandatory=$true,Position=0)][ValidateNotNullOrEmpty()][String]$InputString
    )

    $ResultString = ($InputString.replace('ä', 'ae').replace('ö','oe').replace('ü','ue').replace('Ä', 'Ae').replace('Ö','Oe').replace('Ü','Ue'))

    $ResultString
}

TestReplace -InputString "test-äöüÄÖÜ1234"

Но если та же функция сохранена как часть модуля (.psm1), результат будет test-aeoeueaeoeue1234 - похоже, функция замены - это случайнечувствительный.

Я не могу понять, почему один и тот же код приводит к разным выводам ...

1 Ответ

0 голосов
/ 18 июня 2019

При работе с такими символами может быть лучше преобразовать строку в массив символов и вместо этого иметь дело с целочисленными кодами символов, интерпретация строки может варьироваться в зависимости от хоста.Проверьте этот ответ в C #.

Я перенес это решение в функцию PowerShell, надеюсь, это поможет:

function Replace-Diacritics {
  param 
  (
    $InputString
  )

  $dictionary = @{
    228 = "ae" # [int][char]'ä'
    246 = "oe" # [int][char]'ö'
    252 = "ue" # [int][char]'ü'
    196 = "Ae" # [int][char]'Ä'
    214 = "Oe" # [int][char]'Ö'
    220 = "Ue" # [int][char]'Ü'
    223 = "ss" # [int][char]'ß'
  }

  $sb = New-Object -TypeName "System.Text.StringBuilder";
  $null = ($InputString.ToCharArray() | % { if($dictionary[[int]$_]) { $sb.Append($dictionary[[int]$_]) } else { $sb.Append($_) } });
  return $sb.ToString();
}


$input = "test-äöüÄÖÜ1234";
$expected = "test-aeoeueAeOeUe1234";   
$result = Replace-Diacritics $input;
if($result -eq $expected) 
{
  Write-Host "Test passed. Expected: $expected, Actual: $result" -ForegroundColor Green
}
else
{
  Write-Host "Test failed. Expected: $expected, Actual: $result" -ForegroundColor Red
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...