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 ("
) - É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 â€"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 az UTF-8 karaktert –
bájtként 0xE2 0x80 0x93
kódolja. Ha ezek a bájtok Windows-1252-ként vannak dekódolva, a rendszer karakterekként â€"
értelmezi őket.
Néhány furcsa karaktersorozat, amelyet láthat, a következők:
â€"
helyett–
(en-dash)â€"
helyett—
(em-dash)Ä2
ahelyett, hogyÄ
Â
ahelyett, hogyé
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:
- 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.
- 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.
- 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ülutf8bom
: [UTF-8] és BOMutf16le
: 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:
- @mklement0Válasz a StackOverflow PowerShell-kódolásáról.
- @rkeithhill's blogbejegyzés foglalkozik BOM-less UTF-8 bemenet a PowerShell.
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:
- about_Character_Encoding
- @mklement0A StackOverflow PowerShell-kódolásának összefoglalása
- A VS Code-PowerShellen a kódolási problémák korábbi problémái:
- A klasszikus Joel on Software írása a Unicode-ról
- Kódolás a .NET Standardban
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: