Поиск специального символа U + FFFD (65533) с помощью PowerShell - PullRequest
1 голос
/ 19 апреля 2020

Я собираюсь искать каждое вхождение символа в текстовом файле. Это «�» или более известный как 0xFFFD. Ну, я заставляю все работать, если я ищу нормальную строку, но я не работаю с этим специальным символом. Представьте, что у меня есть указанная строка c в текстовом файле, на которую ссылается $ line, и в нем есть специальный символ, о котором я говорю, например:

$line = 'you cann cho�se f�r everyone'

Затем я попытался создать следующие переменные:

$SearchCharacter1 = "�"
$SearchCharacter2 = $([char]0xFFFD)

Затем я использовал оба из них в следующем коде Powershell, используя команду Select-String

        if($line | Select-String -Pattern $SearchCharacter -SimpleMatch)
        {
            Write-Host "Character involved"
        }else
        {
            Write-Host "Character not involved"
        }

Я также попробовал простое утверждение типа:

        if($line.Contains($SearchCharacter))
        {
            Write-Host "Character involved"
        }else
        {
            Write-Host "Character not involved"
        }

Кто-нибудь, что нужно сделать, чтобы код работал? Что такого особенного в 0xFFFD? Почему все работает, когда я использую нормальный символ. Спасибо за ваше время!

РЕДАКТИРОВАТЬ: я получаю строку, как это:

    foreach ($file in $files){
    $lines = Get-Content $file
    foreach ($line in $lines){
        # Check if the line contains the character we need to change.
        if($line -match $SearchCharacter)
        {
            # And now do sth with $line

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Я подозреваю, что файл закодирован как utf8nobom, и вы используете powershell 5, который не распознает кодировку автоматически. Для этого необходимо указать кодировку:

get-content file -encoding utf8 | select-string �

you cann cho�se f�r everyone

UTF8 кодирует � как "EF BF BD":

format-hex file


   Label: /Users/js/file

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 79 6F 75 20 63 61 6E 6E 20 63 68 6F EF BF BD 73 you cann cho�s
0000000000000010 65 20 66 EF BF BD 72 20 65 76 65 72 79 6F 6E 65 e f�r everyone
0000000000000020 0A                                              �
0 голосов
/ 19 апреля 2020

Можете ли вы попробовать это.

   if($line -match $SearchCharacter) {
     Write-Host "Character involved"
   }
   else {
     Write-Host "Character not involved"
   }
...