Основні відомості про кодування файлів у VS Code та PowerShell
У разі використання VS Code для створення та редагування скриптів PowerShell важливо зберегти файли за допомогою правильного формату кодування символів.
Що таке кодування і чому воно важливе?
VS Code управляє інтерфейсом введення рядка символів у буфер користувачем та читання-запису блоків байтів у файловій системі. При збереженні файлу VS Code використовується кодування тексту для визначення того, які байти отримає кожен символ. Докладнішу інформацію див. у статті Про шифрування символів.
Аналогічно, коли оболонка PowerShell запускає скрипт, їй необхідно перетворити байти з файлу на символи для перетворення файлу на PowerShell. Оскільки VS Code записує файл, а PowerShell зчитує файл, цим засобам необхідно використовувати одну й ту саму систему кодування. Цей процес синтаксичного аналізу скрипта PowerShell відбувається так: байти ->символи ->лексеми ->
дерево абстрактного синтаксису ->виконання.
І VS Code, і PowerShell встановлюються з відповідною конфігурацією кодування за умовчанням. Тим не менш, кодування за промовчанням, що використовується PowerShell, було змінено з випуском PowerShell 6. Щоб уникнути проблем з PowerShell і розширення PowerShell в VS Code, необхідно налаштувати параметри VS Code і PowerShell належним чином.
Поширені причини проблеми з кодуванням
Проблеми з кодуванням виникають, коли кодування VS Code або файл скрипта не відповідає очікуваному кодуванню PowerShell. У PowerShell немає способу автоматично визначити кодування файлу.
Проблеми з кодуванням більш ймовірні при використанні символів не з 7-розрядного кодування ASCII. Наприклад:
- Розширені небуквенні символи, такі як довге тире ( - ), нерозривний пробіл ( ) або ліве подвійне лапка ( " ).
- Латинські символи з діакритикою (É, ü)
- Нелатинські символи, такі як кирилиця ( Д , Ц )
- Символи ієрогліфічного письма (本, 火, が).
Поширені причини проблем із кодуванням:
- Кодування VS Code та PowerShell не було змінено за замовчуванням. У версіях до PowerShell 5.1 (включно) кодування за замовчуванням відрізняється від VS Code, що використовується.
- Відкрито інший редактор і файл перезаписано в новому кодуванні. Це часто відбувається з інтегрованим середовищем сценаріїв.
- Файл перевірка в систему керування версіями в кодуванні, відмінної від того, що очікує на VS Code або PowerShell. Це може статися, коли учасники спільної роботи використовують редактори з різними конфігураціями кодування.
Як визначити наявність проблеми з кодуванням
Часто помилки кодування у скриптах видаються як помилки синтаксичного аналізу. Якщо ви бачите дивну послідовність символів у скрипті, це може бути проблемою. У прикладі нижче тире ( – ) відображається у вигляді символів â€" :
Send-MailMessage : Позитивний параметр може бути невідомий, що вказують на argument 'Testing FuseMail SMTP. '. At C:\Users\Development\PowerShell\Scripts\Send-EmailUsingSmtpRelay.ps1:6 char:1 + Send-MailMessage â€"From $from â€"To $recipient1 â€"Subject $subject . ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Send-MailMessage], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SendMailMessage
Ця проблема виникає, тому що VS Code кодує символ - в UTF-8 як байти 0xE2 0x80 0x93. Коли ці байти декодуються як Windows-1252, вони інтерпретуються як символи — .
Деякі дивні послідовності символів, які можна побачити:
- â€" замість – (en-dash)
- â€" замість - (em-dash)
- Ä2 замість Ä.
- Â замість (нерозривний пробіл).
- é замість é.
Цей зручний довідник перераховує поширені шаблони, які вказують на проблему між кодуванням UTF-8 та Windows-1252.
Взаємодія розширення PowerShell для VS Code з кодуванням
Розширення PowerShell взаємодіє зі скриптами кількома способами:
- При зміні скриптів VS Code вміст відправляється з VS Code в розширення. Протокол мовного сервера вимагає, щоб цей вміст передавався до UTF-8. Тому розширення не може отримати неправильне кодування.
- Під час виконання скриптів в інтегрованій консолі вони зчитуються оболонкою PowerShell безпосередньо з файлу. Якщо кодування PowerShell відрізняється від кодування VS Code, може статися несправність.
- Коли скрипт, відкритий у VS Code, посилається на інший скрипт, який не відкритий у VS Code, розширення повертається до завантаження вмісту цього скрипту з файлової системи. Розширення PowerShell за умовчанням використовує кодування UTF-8, але при цьому застосовує виявлення мітки порядку байтів (BOM), щоб вибрати правильне кодування.
Проблема виникає при припущенні кодування, яке не використовує BOM (такі як UTF-8 без мітки порядку байтів або Windows-1252). Розширення за промовчанням PowerShell використовує UTF-8. Розширення не може змінити параметри кодування VS Code. Для отримання додаткових відомостей див. у розділі Проблема №824.
Вибір відповідного кодування
Різні системи та програми можуть використовувати різні кодування:
- У .NET Standard, в Інтернеті та середовищі Linux тепер в основному використовується кодування UTF-8.
- У багатьох програмах .NET Framework використовується UTF-16. З історичних причин її іноді називають "Юнікод"; зараз цей термін відноситься до більш широкого стандарту, що охоплює UTF-8 та UTF-16.
- У Windows багато програм, які були створені ще до розповсюдження Юнікоду, як і раніше, можуть за замовчуванням використовувати Windows-1252.
Кодування Юнікоду також використовують поняття мітки порядку байтів (BOM). BOM ставиться на початку тексту, щоб декодер міг визначити, яке кодування використовується у тексті. Для багатобайтових кодувань BOM також вказує порядок байтів кодування. BOM є байтами, які рідко зустрічаються в тексті в Юнікоді. Це дозволяє зробити обґрунтоване припущення, що текст записаний в Юнікоді, якщо є мітка BOM.
BOM не є обов'язковими; у світі Linux вони не такі популярні, оскільки у всіх інших місцях використовується надійна угода UTF-8. Більшість програм Linux припускають, що текстове введення кодується в UTF-8. Хоча багато програм Linux розпізнають і правильно обробляють BOM, число не виконується, що призводить до артефактів у тексті, що обробляється цими програмами.
Таким чином:
- Якщо ви працюєте в основному з програмами Windows і Windows PowerShell, слід переважно використовувати такі кодування, як UTF-8 з BOM або UTF-16.
- Якщо ви працюєте на різних платформах, слід віддавати перевагу UTF-8 з BOM.
- Якщо ви працюєте головним чином у контексті Linux, слід віддавати перевагу UTF-8 без BOM.
- Windows-1252 і latin-1 — застарілі кодування, яких слід уникати. Проте деякі програми попередніх версій у Windows залежать від них.
- Також варто зазначити, що підписування скриптів залежить від кодування, тобто зміна кодування в підписаному скрипті вимагатиме повторного підписування.
Налаштування VS Code
Стандартне кодування VS Code — UTF-8 без мітки порядку байтів.
Щоб вказати кодування VS Code, перейдіть до параметрів VS Code ( CTRL + , ) і задайте параметр "files.encoding" :
"files.encoding": "utf8bom"
Можливі такі значення:
- utf8 : [UTF-8] без мітки порядку байтів
- utf8bom : [UTF-8] з міткою порядку байтів
- utf16le : [UTF-16] з прямим порядком байтів
- utf16be : [UTF-16] зі зворотним порядком байтів
- windows1252 : [Windows-1252]
Повинен відобразитися список представлення графічного інтерфейсу користувача або доповнення в поданні JSON.
Щоб забезпечити автоматичне визначення кодування, якщо це можливо, можна також додати наступне:
"files.autoGuessEncoding": true
Якщо ви не бажаєте, щоб ці параметри впливали на всі типи файлів, у VS Code можна задавати конфігурації для кожної мови окремо. Можна створити параметр для певної мови, помістивши параметри в полі [] . Наприклад:
Ви також можете встановити засіб відстеження Gremlins для Visual Studio Code. Це розширення показує певні символи Юнікоду, які легко пошкоджені, оскільки вони невидимі чи виглядають як інші звичайні символи.
Налаштування PowerShell
PowerShell кодування за замовчуванням залежить від версії:
- PowerShell 6+ кодування за замовчуванням на всіх платформах — UTF-8 без мітки порядку байтів.
- У Windows PowerShell стандартне кодування зазвичай є Windows-1252, яка є розширенням latin-1 (також відомого як ISO 8859-1).
У PowerShell 5+ можна визначити кодування за умовчанням так:
[psobject].Assembly.GetTypes() | Where-Object < $_.Name -eq 'ClrFacade'>| ForEach-Object
Наступний скрипт може використовуватися для визначення кодування, яке виводить сеанс PowerShell для скрипта, де немає мітки порядку байтів.
$badBytes = [byte[]]@(0xC3, 0x80) $utf8Str = [System.Text.Encoding]::UTF8.GetString($badBytes) $bytes = [System.Text.Encoding]::ASCII.GetBytes(' Write-Output "') + [byte[]]@(0xC3, 0x80) + [byte[]]@(0x22) $path = Join-Path ([System.IO.Path]::GetTempPath()) 'encodingtest.ps1' try < [System.IO.File]::WriteAllBytes($path, $bytes) switch (& $path) < $utf8Str < return 'UTF-8' break >default < return 'Windows-1252' break >> > finally
Можна налаштувати PowerShell так, щоб використовувати задане кодування у загальному вигляді за допомогою параметрів профілю. Див. наступні статті:
PowerShell змусити використовувати конкретне кодування для вхідних даних неможливо. У PowerShell 5.1 і раніше версій у Windows з мовним стандартом en-US за промовчанням використовується кодування Windows-1252, якщо відсутня мітка порядку байтів. Інші параметри мовного стандарту можуть використовувати інше кодування. Для забезпечення сумісності краще зберігати скрипти в Юнікод з міткою порядку байтів.
Будь-які інші інструменти для роботи зі скриптами PowerShell можуть залежати від вибраних параметрів кодування або перетворювати скрипти на інше кодування.
Існуючі скрипти
Скрипти, які вже знаходяться у файловій системі, можуть потребувати повторного кодування у вказане вами кодування.У нижньому рядку VS Code ви побачите мітку UTF-8. Клацніть, щоб відкрити панель дій, і виберіть команду Зберегти з кодуванням. Тепер ви можете вибрати нове кодування для цього файлу. Докладні інструкції див. у розділі Кодування VS Code.
Якщо вам потрібно повторно кодувати кілька файлів, можна використовувати наступний скрипт:
Get-ChildItem *.ps1 -Recurse | ForEach-Object
Інтегроване середовище сценаріїв (ISE) PowerShell
Під час редагування скриптів за допомогою інтегрованого середовища сценаріїв PowerShell необхідно синхронізувати параметри кодування.
Інтегроване середовище сценаріїв має враховувати мітку порядку байтів, але також можна використовувати відображення для завдання кодування. Зауважте, що це значення не зберігається між запусками.
Система керування версіями
Деякі системи керування версіями, наприклад git, ігнорують кодування; git відстежує лише байти. Поведінка інших, наприклад, Azure DevOps або Mercurial, може відрізнятися. Навіть деякі засоби, що базуються на git, покладаються на декодування тексту.
Якщо це так, переконайтеся, що ви:
- Налаштували кодування в системі керування версіями відповідно до конфігурації VS Code.
- Зробили так, що всі файли додаються до системи керування версіями у відповідному кодуванні.
- Остерігайтеся змінювати кодування, отримані через систему керування версіями. Ключовою ознакою тут буде різницевий файл, який вказує, що зміни відсутні (оскільки змінено байти, але не символи).
Серед інших учасників
Налаштувавши систему керування версіями, також переконайтеся, що параметри інших учасників, які працюють над тими файлами, до яких ви надаєте спільний доступ, не перевизначають кодування шляхом повторного кодування файлів PowerShell.
Інші програми
Всі інші програми, які зчитують або записують скрипти PowerShell, можуть їх перекодувати.
- Використання буфера обміну для копіювання та вставки скрипта. Це часто відбувається у таких сценаріях:
- Копіювання скрипта у віртуальну машину.
- Копіювання скрипту з електронної пошти або веб-сторінки.
- Копіювати скрипт через документ Microsoft Word або PowerPoint.
- Блокнот
- vim
- будь-який інший редактор скриптів PowerShell.
- Get-Content / Set-Content / Out-File
- Оператори перенаправлення PowerShell, такі як > та >> .
- sed/awk
- Веб-браузер під час завантаження скриптів.
- Загальний файловий ресурс.
Деякі з цих засобів працюють із байтами, а не з текстом, але інші дозволяють налаштовувати кодування. У випадках, коли необхідно налаштувати кодування, використовуйте ті ж параметри, що й у вашому редакторі, щоб запобігти виникненню проблем.
Інші ресурси про кодування в PowerShell
Існує кілька інших гідних публікацій на тему кодувань та налаштування кодування PowerShell:
- Про кодування символів
- Огляд @mklement0 про кодування PowerShell на сайті StackOverflow.
- Попередні проблеми, відкриті в VS Code-PowerShell для проблем із кодуванням:
- #1308
- #1628
- #1680
- #1744
- #1751
Джерело цього вмісту можна знайти на GitHub, де також можна створювати та переглядати проблеми та запити на витягування. Для отримання додаткових відомостей див. посібник для учасників.
Декодер онлайн (decoder online)
Визначити вихідне кодування Під час онлайн передачі електронних документів (поштове розсилання, завантаження з сайту тощо) у файлі може збитися кодування. В результаті замість звичних слів, речень та абзаців ви отримуєте послідовність незрозумілих символів. Так відбувається через те, що кодування та декодування інформації відбувається некоректно, і пристрої відправника та одержувача просто не розуміють один одного. Щоб розшифрувати зашифрований текст, зверніться до нашого онлайн-декодера. Decoder (дешифратор або декодер онлайн) від компанії Involta здатний підібрати потрібне кодування та змінити текст так, щоб Ви змогли швидко прочитати незрозумілі «ієрогліфи». Наш інструмент має багато можливостей для декодування. Він дозволяє розшифрувати base64 і визначити вихідні дані, а також перевести інформацію в інше кодування онлайн, наприклад, UTF-8, CP-1251, ASCII. Decoder може функціонувати як шифратор та дешифратор, тобто ви можете закодувати текст і захистити його від сторонніх очей. Якщо вам надіслали посилання з незрозумілою адресою, URL-декодер online покаже, на який сайт вона веде. Ще одна корисна функція сервісу – створити або розкодувати трансліт, якщо потрібно зробити переклад з кирилиці на латиницю та навпаки. Декодер працює в режимі онлайн та доступний на будь-якому пристрої з доступом до інтернету.