PowerShell — экранирование необычных одинарных и двойных кавычек для замены регулярных выражений и строк

#powershell

#powershell

Вопрос:

Я работаю с HTML-файлами, созданными Acrobat, который не использует надлежащие HTML-объекты для экранирования символов Юникода. Мне нужно включить одинарные и двойные кавычки в шаблоне регулярных выражений, но каждая попытка, которую я предпринимал для экранирования этих символов, не удалась в моем скрипте … даже если он работает из обычного сеанса PowerShell.

Например, этот поиск / замена не работает:

     $html = $html.Replace("`“", 'amp;ldquo;')
    $html = $html.Replace("`”", 'amp;rdquo;')
    $html = $html.Replace("`‘", 'amp;lsquo;')
    $html = $html.Replace("`’", 'amp;rsquo;')
 

… но это сработает, если я взломаю свой скрипт и запущу одну из этих строк замены из приглашения отладки.

Редактировать: вот фрагмент разметки, с которой я сейчас тестирую:

 <p style="padding-left: 5pt;text-indent: 17pt;line-height: 119%;text-align: justify;">To guide its readers the Hermetica makes use of the mystical astrological world-view that we have been discussing. It describes the creation of the world as a series of emanations, starting with the Light, who gave birth to a son called Logos. In the words of Hermes’s guide, Poimandres:</p><p style="padding-left: 24pt;text-indent: 0pt;line-height: 119%;text-align: justify;">“That Light,” he said, “is I, even Mind, the first God, who was before the watery substance which appeared out of the darkness; and the Logos which came forth the Light is son of God.”</p><p style="padding-left: 21pt;text-indent: 1pt;line-height: 119%;text-align: justify;">(Scott, Walter, translator, Hermetica: The Ancient Greek and Latin Writings Which Contain Religious or Philosophical Teachings Ascribed to Hermes Trismegistus, Boston: Shambhala: 1985, p. 117)</p>
 

Если $html равно этой строке, мои попытки найти и заменить символы кажутся тщетными.

Комментарии:

1. Фрагмент, который вы опубликовали, кажется, работает, что заставляет меня думать, что в части вашего скрипта происходит что-то еще, что вы не включили.

2. Хммм. $ html — это просто содержимое HTML-файла, сгенерированного Acrobat, и это на ранней стадии синтаксического анализа файла, поэтому я мало что с этим сделал. Если я вывожу содержимое $ html в командной строке отладки (в VSCode), я все равно вижу символы кавычек в Юникоде, а не объекты HTML — то же самое относится и к выводу $ html в текстовый файл, чтобы я мог видеть результат.

3. Я получаю правильные результаты из окна PowerShell, отличного от VSCode, так что это может быть что-то специфичное для расширения PowerShell VSCode.

4. Это очень возможно. Я когда-либо использовал только PowerShell ISE, поэтому не могу сказать, так или иначе.

5. Хорошо, похоже, это проблема с кодировкой моего файла .ps1. Тестовый скрипт, который я создал в ISE, был сохранен как спецификация UTF-8, тогда как VSCode создает файлы UTF8 без спецификации. Созданный ISE тест с кодировкой спецификации работает; точно такой же код , сохраненный как UTF8 в VSCode, не работает.

Ответ №1:

Попробуйте использовать значения Unicode вместо обратных кавычек литерала:

     $html = $html.Replace("`u{201C}", 'amp;ldquo;')
    $html = $html.Replace("`u{201D}", 'amp;rdquo;')
    $html = $html.Replace("`u{2018}", 'amp;lsquo;')
    $html = $html.Replace("`u{2019}", 'amp;rsquo;')
 

Создает

введите описание изображения здесь

Если у вас возникли проблемы с кодировкой (например, UTF-8, как вы предложили), взгляните на https://unicode-table.com — вы можете получить кодовые значения для любой кодировки.

Комментарии:

1. Первый сработал для меня 🙂 хороший ответ

2. Этот формат для объектов Unicode для меня вообще не работает.

Ответ №2:

Очевидно, PowerShell делает забавные вещи с кодировкой UTF-8, отличной от спецификации. Настройка VSCode для автоматического кодирования сценариев PowerShell в формате UTF-8 с помощью спецификации позволяет использовать строку.Замените функцию, чтобы она работала должным образом.