Megosztás a következőn keresztül:


A VSCode-ban és a PowerShellben történő fájlkódolás megértése

Ha a VS Code használatával hoz létre és szerkeszt PowerShell-szkripteket, fontos, hogy a fájlok a megfelelő karakterkódolási formátumban legyenek mentve.

Mi a fájlkódolás, és miért fontos?

A VS Code kezeli a karaktersorozatok pufferbe való bevitele és a fájlrendszerbe történő olvasási/írási blokkok közötti interfészt. Amikor a VS Code ment egy fájlt, egy szövegkódolással dönti el, hogy az egyes karakterek milyen bájtok lesznek. További információ: about_Character_Encoding.

Hasonlóképpen, amikor a PowerShell egy szkriptet futtat, a fájlban lévő bájtokat karakterekké kell konvertálnia, hogy a fájlt PowerShell-programmá alakítsa. Mivel a VS Code írja a fájlt, és a PowerShell beolvassa a fájlt, ugyanazt a kódolási rendszert kell használniuk. A PowerShell-szkriptek elemzésének folyamata a következő: bájtok -karakterek ->>tokenek ->absztrakt szintaxisfa ->végrehajtás.

A VS Code és a PowerShell is ésszerű alapértelmezett kódolási konfigurációval van telepítve. A PowerShell által használt alapértelmezett kódolás azonban megváltozott a PowerShell 6 kiadásával. Annak érdekében, hogy a VS Code-ban ne legyen probléma a PowerShell vagy a PowerShell-bővítmény használatával, megfelelően kell konfigurálnia a VS Code és a PowerShell beállításait.

Kódolási problémák gyakori okai

Kódolási problémák akkor fordulnak elő, ha a VS Code vagy a szkriptfájl kódolása nem egyezik meg a PowerShell várt kódolásával. A PowerShell nem tudja automatikusan meghatározni a fájlkódolást.

Nagyobb valószínűséggel vannak kódolási problémái, ha nem a 7 bites ASCII karakterkészletben lévő karaktereket használja. Példa:

  • Hosszabb nem betűjeles karakterek, például kötőjel (), nem törhető térköz ( ) vagy bal oldali idézőjel (")
  • Ékezetes latin karakterek (É, ü)
  • Nem latin karakterek, mint a cirill (Д, Ц)
  • CJK-karakterek (, , )

A kódolási problémák gyakori okai a következők:

  • A VS Code és a PowerShell kódolása nem változott az alapértelmezetttől. A PowerShell 5.1 és újabb verzió esetén az alapértelmezett kódolás eltér a VS Code-tól.
  • Egy másik szerkesztő megnyitotta és felülírta a fájlt egy új kódolással. Ez gyakran előfordul az I Standard kiadás.
  • A fájl olyan kódolásban van beadva a forrásvezérlőbe, amely eltér a VS Code-tól vagy a PowerShelltől elvárttól. Ez akkor fordulhat elő, ha a közreműködők különböző kódolási konfigurációjú szerkesztőket használnak.

Útmutató kódolási problémák esetén

A kódolási hibák gyakran elemzési hibákként jelentkeznek a szkriptekben. Ha furcsa karaktersorozatokat talál a szkriptben, ez lehet a probléma. Az alábbi példában egy kötőjel () jelenik meg karakterekként â€":

Send-MailMessage : A positional parameter cannot be found that accepts argument 'Testing FuseMail SMTP...'.
At C:\Users\<User>\<OneDrive>\Development\PowerShell\Scripts\Send-EmailUsingSmtpRelay.ps1:6 char:1
+ Send-MailMessage â&euro;"From $from â&euro;"To $recipient1 â&euro;"Subject $subject  ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Send-MailMessage], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SendMailMessage

Ez a probléma azért fordul elő, mert a VS Code az UTF-8 karaktert bájtként 0xE2 0x80 0x93kódolja. Ha ezek a bájtok Windows-1252-ként vannak dekódolva, a rendszer karakterekként â&euro;"értelmezi őket.

Néhány furcsa karaktersorozat, amelyet láthat, a következők:

  • â&euro;" helyett (en-dash)
  • â&euro;" helyett (em-dash)
  • Ä2 ahelyett, hogy Ä
  • Â ahelyett, hogy   (nem törő hely)
  • Ã&copy; ahelyett, hogy é

Ez a hasznos referencia felsorolja azokat a gyakori mintákat, amelyek UTF-8/Windows-1252 kódolási problémát jeleznek.

Hogyan működik a VS Code PowerShell-bővítménye a kódolásokkal?

A PowerShell-bővítmény számos módon kommunikál a szkriptekkel:

  1. A VS Code-ban szerkesztett szkriptek tartalmát a VS Code küldi el a bővítménynek. A Language Server Protocol előírja, hogy a tartalom átvitele az UTF-8-ban történik. Ezért nem lehetséges, hogy a bővítmény helytelen kódolást kapjon.
  2. Amikor a szkripteket közvetlenül az integrált konzolon hajtja végre, a PowerShell közvetlenül felolvassa őket a fájlból. Ha a PowerShell kódolása eltér a VS Code-tól, itt hiba léphet fel.
  3. Ha egy VS Code-ban megnyitott szkript egy másik, a VS Code-ban nem megnyitott szkriptre hivatkozik, a bővítmény vissza fog esni, hogy betöltse a szkript tartalmát a fájlrendszerből. A PowerShell-bővítmény alapértelmezés szerint UTF-8 kódolást használ, de bájtsorrendjelet vagy BOM-észlelést használ a megfelelő kódolás kiválasztásához.

A probléma akkor fordul elő, ha a BOM-ritkábban használt formátumok kódolását feltételezzük (például az UTF-8-at BOM és Windows-1252 nélkül). A PowerShell-bővítmény alapértelmezés szerint UTF-8. A bővítmény nem tudja módosítani a VS Code kódolási beállításait. További információ: #824.

A megfelelő kódolás kiválasztása

A különböző rendszerek és alkalmazások különböző kódolásokat használhatnak:

  • A .NET Standardban, a weben és a Linux-világban az UTF-8 a domináns kódolás.
  • Számos .NET-keretrendszer alkalmazás használja az UTF-16-ot. Előzményként ezt néha "Unicode"-nak is nevezik, amely most egy széles körű szabványra utal, amely az UTF-8 és az UTF-16 szabványt is magában foglalja.
  • Windows rendszeren a Unicode-ot megelőző natív alkalmazások alapértelmezés szerint továbbra is a Windows-1252-t használják.

A Unicode-kódolások a bájtsorrendjel (BOM) fogalmával is rendelkeznek. A boM-k a szöveg elején fordulnak elő, hogy egy dekóder jelezhesse, hogy melyik kódolást használja a szöveg. Több bájtos kódolás esetén a BOM a kódolás endianitását is jelzi. A BOM-eket úgy tervezték, hogy olyan bájtok legyenek, amelyek ritkán fordulnak elő nem Unicode-szövegekben, így ésszerű becslést adnak arról, hogy a szöveg Unicode, amikor egy anyagjegyzék jelen van.

A BOM-ok nem kötelezőek, és a linuxos világban nem olyan népszerűek, mert mindenhol az UTF-8 megbízható konvencióját használják. A legtöbb Linux-alkalmazás feltételezi, hogy a szövegbevitel UTF-8-ban van kódolva. Bár sok Linux-alkalmazás felismeri és helyesen kezeli a BOM-t, egy szám nem, ami az alkalmazásokkal manipulált szövegösszetevőkhöz vezet.

Ezért:

  • Ha elsősorban Windows-alkalmazásokkal és Windows PowerShell-lel dolgozik, érdemes inkább olyan kódolást használnia, mint az UTF-8 a BOM vagy az UTF-16 használatával.
  • Ha több platformon dolgozik, érdemes az UTF-8-at előnyben részesítenie a BOM-tal.
  • Ha elsősorban Linuxhoz kapcsolódó környezetekben dolgozik, érdemes inkább az UTF-8-at BOM nélkül használni.
  • A Windows-1252 és a latin-1 alapvetően örökölt kódolások, amelyeket lehetőség szerint kerülni kell. Néhány régebbi Windows-alkalmazás azonban ezektől függhet.
  • Azt is érdemes megjegyezni, hogy a szkript-aláírás kódolásfüggő, ami azt jelenti, hogy az aláírt szkriptek kódolásának módosítása lemondást igényel.

A VS Code konfigurálása

A VS Code alapértelmezett kódolása az UTF-8 BOM nélkül.

A VS Code kódolásának beállításához nyissa meg a VS Code beállításait (Ctrl+), és állítsa be a "files.encoding" beállítást:

"files.encoding": "utf8bom"

Néhány lehetséges érték:

  • utf8: [UTF-8] BOM nélkül
  • utf8bom: [UTF-8] és BOM
  • utf16le: Kis endian [UTF-16]
  • utf16be: Big endian [UTF-16]
  • windows1252: [Windows-1252]

Ehhez le kell kapnia egy legördülő menüt a grafikus felhasználói felület nézetében, vagy a JSON-nézetben a befejezéseket.

Ha lehetséges, a következőt is hozzáadhatja az automatikus kódoláshoz:

"files.autoGuessEncoding": true

Ha nem szeretné, hogy ezek a beállítások az összes fájltípust befolyásolják, a VS Code nyelvenkénti konfigurációkat is lehetővé tesz. Hozzon létre egy nyelvspecifikus beállítást, ha a beállításokat egy [<language-name>] mezőbe helyezi. Példa:

"[powershell]": {
    "files.encoding": "utf8bom",
    "files.autoGuessEncoding": true
}

Érdemes lehet megfontolni a Visual Studio Code Gremlins-követőjének telepítését is. Ez a bővítmény olyan Unicode-karaktereket jelenít meg, amelyek könnyen megsérülhetnek, mert láthatatlanok, vagy más normál karakterekhez hasonlóan néznek ki.

A PowerShell konfigurálása

A PowerShell alapértelmezett kódolása a verziótól függően változik:

  • A PowerShell 6+-ban az alapértelmezett kódolás az UTF-8 az összes platformon BOM nélkül.
  • A Windows PowerShellben az alapértelmezett kódolás általában Windows-1252, amely a latin-1 (más néven ISO 8859-1) kiterjesztése.

A PowerShell 5+-ban az alábbi módon találja meg az alapértelmezett kódolást:

[psobject].Assembly.GetTypes() | Where-Object { $_.Name -eq 'ClrFacade'} |
  ForEach-Object {
    $_.GetMethod('GetDefaultEncoding', [System.Reflection.BindingFlags]'nonpublic,static').Invoke($null, @())
  }

Az alábbi szkripttel meghatározhatja, hogy a PowerShell-munkamenetek milyen kódolással következtetnek egy BOM nélküli szkriptre.

$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
{
    Remove-Item $path
}

A PowerShell konfigurálható úgy, hogy egy adott kódolást általánosabban használjon a profilbeállítások használatával. Tekintse meg az alábbi cikkeket:

A PowerShell nem kényszeríthető egy adott bemeneti kódolás használatára. A Windowson futó PowerShell 5.1 és újabb verzió az en-US beállítású területi beállítással a Windows-1252 kódolást állítja be, ha nincs AJ. Más területi beállítások eltérő kódolást használhatnak. Az együttműködés biztosítása érdekében a legjobb, ha Unicode formátumban menti a szkripteket egy anyagjegyzékkel.

Fontos

A PowerShell-szkripteket érintő egyéb eszközökre hatással lehetnek a kódolási lehetőségek, vagy újrakódolhatja a szkripteket egy másik kódolásra.

Meglévő szkriptek

Előfordulhat, hogy a fájlrendszerben már meglévő szkripteket újra kell kódolni az új választott kódoláshoz. A VS Code alsó sávján az UTF-8 felirat látható. Kattintson rá a műveletsáv megnyitásához, és válassza a Mentés kódolással lehetőséget. Most már választhat egy új kódolást a fájlhoz. A teljes útmutatásért tekintse meg a VS Code kódolását .

Ha több fájlt kell újrakódolnia, a következő szkriptet használhatja:

Get-ChildItem *.ps1 -Recurse | ForEach-Object {
    $content = Get-Content -Path $_
    Set-Content -Path $_.Fullname -Value $content -Encoding UTF8 -PassThru -Force
}

A PowerShell integrált szkriptelési környezete (I Standard kiadás)

Ha szkripteket is szerkeszt a PowerShell I Standard kiadás használatával, ott szinkronizálnia kell a kódolási beállításokat.

Az I Standard kiadás-nak tiszteletben kell tartania egy anyagjegyzéket, de a kódolás beállításához tükröződés is használható. Vegye figyelembe, hogy ez nem marad fenn az indítások között.

Forrásvezérlő szoftver

Egyes forrásvezérlő eszközök, például a git figyelmen kívül hagyják a kódolásokat; Git csak nyomon követi a bájtokat. Előfordulhat, hogy mások, például az Azure DevOps vagy a Mercurial nem. Még néhány git-alapú eszköz is a szöveg dekódolására támaszkodik.

Ebben az esetben győződjön meg arról, hogy:

  • Konfigurálja a szövegkódolást a forrásvezérlőben a VS Code konfigurációjának megfelelően.
  • Győződjön meg arról, hogy az összes fájl be van jelölve a forrásvezérlőbe a megfelelő kódolásban.
  • Legyen óvatos a forrásvezérlőn keresztül kapott kódolás módosításaival. Ennek a kulcsjele egy változásra utaló diff, de ahol úgy tűnik, hogy semmi sem változott (mivel a bájtok csak karakterekkel rendelkeznek, nem).

Közreműködők környezetei

A forrásvezérlés konfigurálása mellett győződjön meg arról, hogy a megosztott fájlok közreműködői nem rendelkeznek olyan beállításokkal, amelyek felülírják a kódolást a PowerShell-fájlok újrakódolásával.

Egyéb programok

Bármely más, PowerShell-szkriptet olvasó vagy író program újrakódolhatja azt.

Néhány példa:

  • Szkript másolása és beillesztése a vágólap használatával. Ez gyakori az olyan helyzetekben, mint a következő:
    • Szkript másolása virtuális gépre
    • Szkript másolása e-mailből vagy weblapról
    • Szkript másolása Microsoft Word- vagy PowerPoint-dokumentumba vagy onnan
  • Egyéb szövegszerkesztők, például:
    • Jegyzettömb
    • vim
    • Bármely más PowerShell-szkriptszerkesztő
  • Szövegszerkesztő segédprogramok, például:
    • Get-Content/Set-Content/Out-File
    • PowerShell-átirányítási operátorok, például > és >>
    • sed/awk
  • Fájlátviteli programok, például:
    • Webböngésző szkriptek letöltésekor
    • Fájlmegosztás

Ezen eszközök némelyike szöveg helyett bájtokban dolgozik, míg mások kódolási konfigurációkat kínálnak. Azokban az esetekben, amikor konfigurálnia kell egy kódolást, a problémák elkerülése érdekében ugyanazt kell tennie, mint a szerkesztő kódolását.

A PowerShell-ben történő kódolással kapcsolatos egyéb erőforrások

A Kódolás a PowerShellben való kódolásával és konfigurálásával kapcsolatban van néhány további szép bejegyzés, amelyeket érdemes elolvasni: