A VSCode-ban és a PowerShellben történő fájlkódolás megértéseUnderstanding file encoding in VS Code and PowerShell

Ha a VS Code-t használja PowerShell-parancsfájlok létrehozásához és szerkesztéséhez, akkor fontos, hogy a fájlokat a megfelelő karakterkódolási formátum használatával mentse a rendszer.When using VS Code to create and edit PowerShell scripts, it is important that your files are saved using the correct character encoding format.

Mi a fájl kódolása, és miért fontos?What is file encoding and why is it important?

A VS Code úgy kezeli a felületet, hogy egy emberi karakterek beírása egy pufferbe, valamint bájtos írási/olvasási blokkokba írja a fájlrendszert.VS Code manages the interface between a human entering strings of characters into a buffer and reading/writing blocks of bytes to the filesystem. Ha a VS Code elment egy fájlt, a szöveges kódolással dönti el, hogy az egyes karakterek hány bájtot használnak.When VS Code saves a file, it uses a text encoding to decide what bytes each character becomes.

Hasonlóképpen, amikor a PowerShell parancsfájlt futtat, a fájlt egy fájlba kell konvertálnia, hogy újra létrehozza a fájlt egy PowerShell-programba.Similarly, when PowerShell runs a script it must convert the bytes in a file to characters to reconstruct the file into a PowerShell program. Mivel a VS Code beírja a fájlt, és a PowerShell beolvassa a fájlt, ugyanazt a kódolási szolgáltatást kell használnia.Since VS Code writes the file and PowerShell reads the file, they need to use the same encoding system. A PowerShell-szkriptek elemzésének folyamata a következő lépésekkel történik: bájt -> karakterek -> token -> absztrakt szintaxis faszerkezetes -> végrehajtás.This process of parsing a PowerShell script goes: bytes -> characters -> tokens -> abstract syntax tree -> execution.

A VS Code és a PowerShell is egy ésszerű alapértelmezett kódolási konfigurációval van telepítve.Both VS Code and PowerShell are installed with a sensible default encoding configuration. A PowerShell által használt alapértelmezett kódolás azonban megváltozott a PowerShell Core (v6. x) kiadásával.However, the default encoding used by PowerShell has changed with the release of PowerShell Core (v6.x). Annak biztosítása érdekében, hogy ne legyen probléma a PowerShell-lel vagy a PowerShell-bővítménnyel a VS Code-ban, a VS Code és a PowerShell beállításait megfelelően kell konfigurálni.To ensure you have no problems using PowerShell or the PowerShell extension in VS Code, you need to configure your VS Code and PowerShell settings properly.

A kódolási problémák gyakori okaiCommon causes of encoding issues

Kódolási problémák akkor fordulnak elő, ha a VS kód vagy a parancsfájl kódolása nem egyezik a PowerShell várt kódolásával.Encoding problems occur when the encoding of VS Code or your script file does not match the expected encoding of PowerShell. A PowerShell a fájl kódolásának automatikus meghatározására nincs mód.There is no way for PowerShell to automatically determine the file encoding.

A 7 bites ASCII karakterkészletbennem szereplő karakterek használata esetén valószínűleg kódolási problémákba kerül.You're more likely to have encoding problems when you're using characters not in the 7-bit ASCII character set. Például:For example:

  • Kiterjesztett nem betűs karakterek, például em-Dash ( ), nem törhető szóköz ( ) vagy bal idézőjel ( " )Extended non-letter characters like em-dash (), non-breaking space ( ) or left double quotation mark (")
  • Ékezetes latin karakterek ( É , ü )Accented latin characters (É, ü)
  • Nem latin betűs karakterek, például cirill betűs ( Д , Ц )Non-latin characters like Cyrillic (Д, Ц)
  • CJK karakterek ( , , )CJK characters (, , )

A kódolási problémák gyakori okai a következők:Common reasons for encoding issues are:

  • A VS Code és a PowerShell kódolása nem módosult az alapértelmezett értékektől.The encodings of VS Code and PowerShell have not been changed from their defaults. A PowerShell 5,1-es és alacsonyabb verziójában az alapértelmezett kódolás eltér a VS Code-tól.For PowerShell 5.1 and below, the default encoding is different from VS Code's.
  • Egy másik szerkesztő megnyitotta és felülírta a fájlt egy új kódolásban.Another editor has opened and overwritten the file in a new encoding. Ez gyakran előfordul az ISE-ben.This often happens with the ISE.
  • A fájl egy olyan kódolásban van bejelölve a verziókövetésba, amely eltér a VS Code vagy a PowerShell által várt értéktől.The file is checked into source control in an encoding that is different from what VS Code or PowerShell expects. Ez akkor fordulhat elő, ha a közreműködők különböző kódolási konfigurációkkal rendelkező szerkesztőket használnak.This can happen when collaborators use editors with different encoding configurations.

A kódolással kapcsolatos problémák elhárításaHow to tell when you have encoding issues

A parancsfájlokban az elemzési hibák gyakran jelentkeznek kódolási hibákként.Often encoding errors present themselves as parse errors in scripts. Ha furcsa karakteres sorozatot talál a szkriptben, ez a probléma lehet.If you find strange character sequences in your script, this can be the problem. Az alábbi példában egy en-Dash ( ) karakterként jelenik meg â€" :In the example below, an en-dash () appears as the characters â€":

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 â€"From $from â€"To $recipient1 â€"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 UTF-8 kódolással kódolja a karaktert bájtként 0xE2 0x80 0x93 .This problem occurs because VS Code encodes the character in UTF-8 as the bytes 0xE2 0x80 0x93. Ha ezeket a bájtokat Windows-1252-ként dekódolja, a rendszer karakterekként értelmezi őket â€" .When these bytes are decoded as Windows-1252, they are interpreted as the characters â€".

Néhány olyan furcsa karakteres sorozatot tartalmaz, amelyeket láthat:Some strange character sequences that you might see include:

  • â€" ahelyett, hogy â€" instead of
  • â€" ahelyett, hogy â€" instead of
  • Ä2 ahelyett, hogy ÄÄ2 instead of Ä
  • Â a helyett   (nem megszakított terület)Â instead of   (a non-breaking space)
  • é ahelyett, hogy éé instead of é

Ez a hasznos útmutató az UTF-8/Windows-1252 kódolási problémára utaló általános mintákat sorolja fel.This handy reference lists the common patterns that indicate a UTF-8/Windows-1252 encoding problem.

A VS Code PowerShell-bővítménye a kódolásokkal kommunikálHow the PowerShell extension in VS Code interacts with encodings

A PowerShell-bővítmény több módon is együttműködik a parancsfájlokkal:The PowerShell extension interacts with scripts in a number of ways:

  1. Ha a parancsfájlok a VS Code-ban vannak szerkesztve, a tartalmat a VS Code továbbítja a bővítménynek.When scripts are edited in VS Code, the contents are sent by VS Code to the extension. A nyelvi kiszolgáló protokollja előírja, hogy ezt a tartalmat UTF-8-ban továbbítja a rendszer.The Language Server Protocol mandates that this content is transferred in UTF-8. Ezért nem lehetséges, hogy a bővítmény helytelen kódolást kapjon.Therefore, it is not possible for the extension to get the wrong encoding.
  2. Ha a parancsfájlokat közvetlenül az integrált konzolon hajtják végre, a rendszer közvetlenül a PowerShellből olvassa be őket a fájlból.When scripts are executed directly in the Integrated Console, they're read from the file by PowerShell directly. Ha a PowerShell kódolása különbözik a VS Code-tól, valami nem lehet rossz.If PowerShell's encoding differs from VS Code's, something can go wrong here.
  3. Ha a VS Code-ban megnyitott parancsfájl egy másik olyan parancsfájlra hivatkozik, amely nem a VS Code-ban van megnyitva, a bővítmény visszaesik a parancsfájl tartalmának a fájlrendszerből való betöltésére.When a script that is open in VS Code references another script that is not open in VS Code, the extension falls back to loading that script's content from the file system. A PowerShell-bővítmény alapértelmezés szerint UTF-8 kódolást használ, de [byte-Order jelet][]vagy anyagjegyzéket használ, és kiválaszthatja a megfelelő kódolást.The PowerShell extension defaults to UTF-8 encoding, but uses byte-order mark, or BOM, detection to select the correct encoding.

A probléma akkor fordul elő, ha az ANYAGJEGYZÉK nélküli formátumok kódolását feltételezi (például: UTF-8 , AJ és Windows-1252).The problem occurs when assuming the encoding of BOM-less formats (like UTF-8 with no BOM and Windows-1252). A PowerShell-bővítmény alapértelmezés szerint UTF-8.The PowerShell extension defaults to UTF-8. A bővítmény nem tudja módosítani a VS Code kódolási beállításait.The extension cannot change VS Code's encoding settings. További információ: #824 kiadása.For more information, see issue #824.

A megfelelő kódolás kiválasztásaChoosing the right encoding

A különböző rendszerek és alkalmazások különböző kódolásokat használhatnak:Different systems and applications can use different encodings:

  • A .NET Standard, a weben és a Linux világában az UTF-8 mostantól a domináns kódolás.In .NET Standard, on the web, and in the Linux world, UTF-8 is now the dominant encoding.
  • Számos .NET-keretrendszerbeli alkalmazás [UTF-16-][]ot használ.Many .NET Framework applications use UTF-16. A korábbi okok miatt ezt néha "Unicode"-nak is nevezzük, egy olyan kifejezés, amely az UTF-8 és az UTF-16 kódolást is magában foglaló általános szabványra hivatkozik.For historical reasons, this is sometimes called "Unicode", a term that now refers to a broad standard that includes both UTF-8 and UTF-16.
  • Windows rendszeren az alapértékű Unicode-ot futtató számos natív alkalmazás továbbra is a Windows-1252-et használja alapértelmezés szerint.On Windows, many native applications that predate Unicode continue to use Windows-1252 by default.

A Unicode-kódolások esetében egy byte-Order Mark (BOM) fogalma is van.Unicode encodings also have the concept of a byte-order mark (BOM). Az AJ-ket a szöveg elején kell megadnia, hogy megismertesse a szöveget használó dekódert.BOMs occur at the beginning of text to tell a decoder which encoding the text is using. A több bájtos kódolás esetén az AJ a kódolás endianness is jelzi.For multi-byte encodings, the BOM also indicates endianness of the encoding. Az anyagjegyzékek úgy vannak kialakítva, hogy olyan bájtok legyenek, amelyek ritkán fordulnak elő nem Unicode-szövegekben, így ésszerű kitalálni, hogy a szöveg Unicode, ha van ilyen.BOMs are designed to be bytes that rarely occur in non-Unicode text, allowing a reasonable guess that text is Unicode when a BOM is present.

Az anyagjegyzékek nem kötelezőek, és az elfogadásuk nem annyira népszerű a Linux-világban, mert az UTF-8 egy megbízható konvenciója mindenhol használatos.BOMs are optional and their adoption isn't as popular in the Linux world because a dependable convention of UTF-8 is used everywhere. A legtöbb Linux-alkalmazás feltételezi, hogy a szöveges bevitel UTF-8-ban van kódolva.Most Linux applications presume that text input is encoded in UTF-8. Habár számos Linux-alkalmazás felismeri és megfelelően kezeli az ANYAGJEGYZÉKet, egy szám nem, amely az alkalmazásokkal manipulált szövegben szereplő összetevőkhöz vezet.While many Linux applications will recognize and correctly handle a BOM, a number do not, leading to artifacts in text manipulated with those applications.

Ezért:Therefore:

  • Ha elsősorban a Windows-alkalmazásokkal és a Windows PowerShell-lel dolgozik, érdemes lehet olyan kódolást használnia, mint például az UTF-8, az BOM vagy az UTF-16.If you work primarily with Windows applications and Windows PowerShell, you should prefer an encoding like UTF-8 with BOM or UTF-16.
  • Ha több platformon dolgozik, az UTF-8-at használja az AJ-vel.If you work across platforms, you should prefer UTF-8 with BOM.
  • Ha főleg a Linux rendszerhez kapcsolódó kontextusokban dolgozik, az UTF-8-at ANYAGJEGYZÉK nélkül érdemes előnyben részesíteni.If you work mainly in Linux-associated contexts, you should prefer UTF-8 without BOM.
  • A Windows-1252 és a Latin-1 alapvetően örökölt kódolás, amelyet lehetőleg el kell kerülnie.Windows-1252 and latin-1 are essentially legacy encodings that you should avoid if possible. Előfordulhat azonban, hogy néhány régebbi Windows-alkalmazás függ rajtuk.However, some older Windows applications may depend on them.
  • Azt is érdemes megjegyezni, hogy a parancsfájl-aláírás a kódolástól függ, ami azt jelenti, hogy az aláírt parancsfájlok kódolásának változása csak az aláírást igényli.It's also worth noting that script signing is encoding-dependent, meaning a change of encoding on a signed script will require resigning.

A VS Code konfigurálásaConfiguring VS Code

A VS Code alapértelmezett kódolása: UTF-8, AJ nélkül.VS Code's default encoding is UTF-8 without BOM.

A [vs Code kódolásának][]beállításához nyissa meg a vs Code-beállításokat (CTRL + ,), és állítsa be a következő "files.encoding" beállítást:To set VS Code's encoding, go to the VS Code settings (Ctrl+,) and set the "files.encoding" setting:

"files.encoding": "utf8bom"

A lehetséges értékek a következők:Some possible values are:

Ehhez le kell kérnie ezt a legördülő listát a grafikus felhasználói felületen vagy a JSON-nézetben.You should get a dropdown for this in the GUI view, or completions for it in the JSON view.

A következőt is hozzáadhatja a kódolás automatikus észleléséhez, ha lehetséges:You can also add the following to autodetect encoding when possible:

"files.autoGuessEncoding": true

Ha nem szeretné, hogy ezek a beállítások az összes fájltípusra hatással legyenek, a VS Code lehetővé teszi a nyelvi konfigurációkat is.If you don't want these settings to affect all files types, VS Code also allows per-language configurations. Nyelvspecifikus beállítás létrehozása a beállítások egy mezőben való elhelyezésével [<language-name>] .Create a language-specific setting by putting settings in a [<language-name>] field. Például:For example:

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

A PowerShell konfigurálásaConfiguring PowerShell

A PowerShell alapértelmezett kódolása a verziótól függően változik:PowerShell's default encoding varies depending on version:

  • A PowerShell 6 + esetében az alapértelmezett kódolás UTF-8, az összes platformon ANYAGJEGYZÉK nélkül.In PowerShell 6+, the default encoding is UTF-8 without BOM on all platforms.
  • A Windows PowerShellben az alapértelmezett kódolás általában a Windows-1252, a Latin-1kiterjesztés, amely az ISO 8859-1 néven is ismert.In Windows PowerShell, the default encoding is usually Windows-1252, an extension of latin-1, also known as ISO 8859-1.

A PowerShell 5 +-ban megtalálhatja az alapértelmezett kódolást a következővel:In PowerShell 5+ you can find your default encoding with this:

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

A következő szkripttel határozható meg, hogy a PowerShell-munkamenet milyen kódolást végez egy AJ nélküli parancsfájlhoz.The following script can be used to determine what encoding your PowerShell session infers for a script without a BOM.

$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.It's possible to configure PowerShell to use a given encoding more generally using profile settings. Lásd az alábbi cikkeket:See the following articles:

Nem lehet kényszeríteni a PowerShellt egy adott bemeneti kódolás használatára.It's not possible to force PowerShell to use a specific input encoding. A PowerShell 5,1-es és régebbi verziójában a Windows rendszerre való futtatásakor a területi beállítás az en-US értékre van állítva, az alapértelmezett érték a Windows-1252 kódolás, ha nincs ANYAGJEGYZÉK.PowerShell 5.1 and below, running on Windows with the locale set to en-US, defaults to Windows-1252 encoding when there's no BOM. Más területi beállítások eltérő kódolást alkalmazhatnak.Other locale settings may use a different encoding. Az együttműködési képesség biztosításához célszerű Unicode formátumú parancsfájlokat menteni egy AJ-vel.To ensure interoperability, it's best to save scripts in a Unicode format with a BOM.

Fontos

Minden egyéb olyan eszközt, amelyet az érintéses PowerShell-parancsfájlok érintenek, befolyásolhatják a kódolási beállításokat, vagy újrakódolják a parancsfájlokat egy másik kódolásba.Any other tools you have that touch PowerShell scripts may be affected by your encoding choices or re-encode your scripts to another encoding.

Meglévő parancsfájlokExisting scripts

Előfordulhat, hogy a fájlrendszerben már meglévő parancsfájlokat újra kell kódolni az új kiválasztott kódoláshoz.Scripts already on the file system may need to be re-encoded to your new chosen encoding. A VS Code alsó sávjában az UTF-8 felirat jelenik meg.In the bottom bar of VS Code, you'll see the label UTF-8. Kattintson rá a művelet sávjának megnyitásához, majd válassza a Mentés kódolássallehetőséget.Click it to open the action bar and select Save with encoding. Most már választhat új kódolást a fájlhoz.You can now pick a new encoding for that file. Részletes utasításokért lásd a [vs Code kódolását][] ismertető témakört.See VS Code's encoding for full instructions.

Ha több fájlt is újra kell kódolnia, használja a következő parancsfájlt:If you need to re-encode multiple files, you can use the following script:

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

A PowerShell integrált parancsfájl-kezelési környezete (ISE)The PowerShell Integrated Scripting Environment (ISE)

Ha a PowerShell ISE használatával is szerkeszt parancsfájlokat, szinkronizálnia kell a kódolási beállításokat.If you also edit scripts using the PowerShell ISE, you need to synchronize your encoding settings there.

Az ISE-nek el kell látnia egy AJ-t, de a kódolás beállításáhozis használható a reflexió.The ISE should honor a BOM, but it's also possible to use reflection to set the encoding. Vegye figyelembe, hogy ez az indítások között nem marad meg.Note that this wouldn't be persisted between startups.

Verziókövetés szoftverSource control software

Egyes verziókövetés-eszközök, például a git, a kódolás mellőzése; a git csak a bájtokat követi nyomon.Some source control tools, such as git, ignore encodings; git just tracks the bytes. Mások, például az Azure DevOps vagy a Mercurial, nem.Others, like Azure DevOps or Mercurial, may not. Még néhány git-alapú eszköz is a dekódolás szövegét használja.Even some git-based tools rely on decoding text.

Ha ez a helyzet, győződjön meg róla, hogy:When this is the case, make sure you:

  • Konfigurálja a verziókövetés szövegének kódolását úgy, hogy az megfeleljen a VS Code-konfigurációnak.Configure the text encoding in your source control to match your VS Code configuration.
  • Győződjön meg arról, hogy az összes fájl be van jelölve a verziókövetésba a megfelelő kódolásban.Ensure all your files are checked into source control in the relevant encoding.
  • Legyen óvatos a verziókövetés által fogadott kódolás módosításaival.Be wary of changes to the encoding received through source control. Ennek egyik kulcsfontosságú jele a változás, de ha semmi sem változik (mivel a bájtok száma, de a karakterek nem).A key sign of this is a diff indicating changes but where nothing seems to have changed (because bytes have but characters have not).

Közreműködők környezeteiCollaborators' environments

A verziókövetés konfigurálása során győződjön meg arról, hogy a megosztott fájlokon lévő közreműködők nem rendelkeznek olyan beállításokkal, amelyek felülbírálják a kódolást a PowerShell-fájlok újrakódolásával.On top of configuring source control, ensure that your collaborators on any files you share don't have settings that override your encoding by re-encoding PowerShell files.

Egyéb programokOther programs

A PowerShell-parancsfájlokat olvasó vagy írást beolvasó más programok is újra kódolják.Any other program that reads or writes a PowerShell script may re-encode it.

Néhány példa:Some examples are:

  • Parancsfájl másolása és beillesztése a vágólap használatával.Using the clipboard to copy and paste a script. Ez gyakori olyan helyzetekben, mint például:This is common in scenarios like:
    • Szkript másolása egy virtuális gépreCopying a script into a VM
    • Parancsfájl másolása e-mailben vagy weboldalrólCopying a script out of an email or webpage
    • Parancsfájl másolása Microsoft Word-vagy PowerPoint-dokumentumba vagy-bőlCopying a script into or out of a Microsoft Word or PowerPoint document
  • Egyéb szövegszerkesztők, például:Other text editors, such as:
    • NotepadNotepad
    • vimvim
    • Bármely más PowerShell-parancsfájl-szerkesztőAny other PowerShell script editor
  • Szövegszerkesztés segédprogramok, például:Text editing utilities, like:
    • Get-Content/Set-Content/Out-File
    • PowerShell-átirányítási operátorok > , például és >>PowerShell redirection operators like > and >>
    • sed/awk
  • Fájlátviteli programok, például:File transfer programs, like:
    • Egy webböngésző, parancsfájl letöltésekorA web browser, when downloading scripts
    • FájlmegosztásA file share

Ezen eszközök némelyike nem szöveg helyett bájtok kezelésére szolgál, mások pedig kódolási konfigurációkat biztosítanak.Some of these tools deal in bytes rather than text, but others offer encoding configurations. Azokban az esetekben, amikor egy kódolást kell beállítania, meg kell egyeznie a szerkesztő kódolásával a problémák megelőzése érdekében.In those cases where you need to configure an encoding, you need to make it the same as your editor encoding to prevent problems.

Egyéb erőforrások a PowerShell-kódolásbanOther resources on encoding in PowerShell

Van néhány más jó bejegyzés a PowerShellben a kódoláshoz és a kódolás konfigurálásához, és érdemes olvasni:There are a few other nice posts on encoding and configuring encoding in PowerShell that are worth a read: