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


karakterkódolásról

Rövid leírás

Ismerteti, hogyan használja a PowerShell a karakterkódolást a sztringadatok bemenetéhez és kimenetéhez.

Hosszú leírás

A Unicode egy globális karakterkódolási szabvány. A rendszer kizárólag a Unicode-t használja karakter- és sztringmanipulációhoz. A Unicode minden aspektusának részletes leírását a Unicode Standardtalálja.

A Windows támogatja a Unicode és a hagyományos karakterkészleteket. A hagyományos karakterkészletek, például a Windows-kódlapok, 8 bites értékeket vagy 8 bites értékek kombinációját használják az adott nyelv vagy földrajzi régió beállításaiban használt karakterek megjelenítéséhez.

A PowerShell alapértelmezés szerint Unicode-karakterkészletet használ. Azonban több parancsmag rendelkezik egy kódolási paraméterrel, amely megadhat kódolást egy másik karakterkészlethez. Ez a paraméter lehetővé teszi a más rendszerekkel és alkalmazásokkal való együttműködéshez szükséges karakterkódolás kiválasztását.

Az alábbi parancsmagok kódolási paramétert rendelkeznek:

  • Microsoft.PowerShell.Management
    • Add-Content
    • Get-Content
    • Set-Content
  • Microsoft.PowerShell.Utility
    • Export-Clixml
    • Export-Csv
    • Export-PSSession
    • Format-Hex
    • Import-Csv
    • Out-File
    • Select-String
    • Send-MailMessage

A bájt sorrend jelzés

A bájtsorrend-jelölés (BOM) egy Unicode-aláírási egy fájl vagy szövegfolyam első néhány bájtjában, amely jelzi, hogy melyik Unicode-kódolást használják az adatokhoz. További információt a byte-rendelésjel dokumentációjában talál.

A Windows PowerShellben az UTF7kivételével minden Unicode-kódolás mindig létrehoz egy anyagjegyzéket. A PowerShell (v6-os és újabb) alapértelmezés szerint utf8NoBOM az összes szöveges kimenethez.

A legjobb általános kompatibilitás érdekében kerülje a BOM-eket az UTF-8 fájlokban. A Windows-platformokon is használt Unix-platformok és Unix-örökség segédprogramok nem támogatják a BOM-eket.

Hasonlóképpen kerülni kell UTF7 kódolást is. Az UTF-7 nem szabványos Unicode-kódolás, és AOM nélkül van megírva a PowerShell minden verziójában.

PowerShell-szkriptek létrehozása Unix-szerű platformon vagy windowsos platformfüggetlen szerkesztő használatával, például Visual Studio Code-tal, UTF8NoBOMkódolt fájlt eredményez. Ezek a fájlok jól működnek a PowerShellben, de a Windows PowerShellben megszakadhatnak, ha a fájl nem Ascii karaktereket tartalmaz.

Ha nem Ascii karaktereket kell használnia a szkriptekben, mentse őket UTF-8 formátumban a BOM használatával. A BOM nélkül a Windows PowerShell helytelenül értelmezi a szkriptet, mivel az az örökölt "ANSI" kódlapon van kódolva. Ezzel szemben az UTF-8 BOM-et tartalmazó fájlok problémásak lehetnek a Unix-szerű platformokon. Számos Unix-eszköz, például cat, sed, awk, és egyes szerkesztők, például gedit nem tudják, hogyan kell kezelni a BOM-t.

Karakterkódolás a Windows PowerShellben

A PowerShell 5.1-ben a Kódolás paraméter a következő értékeket támogatja:

  • Ascii Ascii (7 bites) karakterkészletet használ.
  • BigEndianUnicode UTF-16-ot használ a big-endian (nagytól kicsi felé) bájtsorrenddel.
  • BigEndianUTF32 UTF-32-t használ a big-endian bájtsorrenddel.
  • Byte egy karakterhalmazt kódol bájtok sorozatába.
  • Default A rendszer aktív kódlapjának (általában ANSI) megfelelő kódolást használja.
  • Oem A rendszer aktuális OEM-kódlapjának megfelelő kódolást használja.
  • String ugyanaz, mint Unicode.
  • Unicode UTF-16-ot használ a kis végű bájtsorrenddel.
  • Unknown ugyanaz, mint Unicode.
  • UTF32 UTF-32-t használ a kis végű bájtsorrenddel.
  • UTF7 UTF-7-et használ.
  • UTF8 UTF-8-at használ (BOM-tal).

A Windows PowerShell általában alapértelmezés szerint a Unicode UTF-16LE kódolást használja. A Windows PowerShell parancsmagjai által használt alapértelmezett kódolás azonban nem konzisztens.

Jegyzet

Bármelyik Unicode-kódolás használata, kivéve UTF7, mindig létrehoz egy BOM-ot.

Fájlokba kimenetet író parancsmagok esetén:

  • Out-File és az átirányítási operátorok > és >> UTF-16LE-t hoznak létre, ami jelentősen különbözik Set-Content-tól és Add-Content-től.

  • New-ModuleManifest és Export-Clixml UTF-16LE-fájlokat is létrehoz.

  • Ha a célfájl üres vagy nem létezik, Set-Content és Add-Content használjon Default kódolást. Default az aktív rendszer területi beállításának ANSI örökölt kódlapja által megadott kódolás.

  • Export-Csv Ascii fájlokat hoz létre, de eltérő kódolást használ Append paraméter használatakor (lásd alább).

  • Export-PSSession alapértelmezés szerint UTF-8 fájlokat hoz létre a BOM használatával.

  • New-Item -Type File -Value létrehoz egy BOM-less UTF-8 fájlt.

  • Send-MailMessage alapértelmezés szerint Ascii kódolást használ.

  • Start-Transcript létrehoz Utf8 fájlokat egy anyagjegyzékkel. A Append paraméter használata esetén a kódolás eltérő lehet (lásd alább).

Meglévő fájlhoz hozzáfűző parancsok esetén:

  • Out-File -Append és a >> átirányítási operátor nem próbál megegyezni a meglévő célfájl tartalmának kódolásával. Ehelyett az alapértelmezett kódolást használják, kivéve, ha a Kódolás paramétert használják. A fájlok eredeti kódolását kell használnia a tartalom hozzáfűzésekor.

  • Explicit Kódolás paraméter hiányában Add-Content észleli a meglévő kódolást, és automatikusan alkalmazza azt az új tartalomra. Ha a meglévő tartalom nem tartalmaz bájt sorrendi jelölést, Default ANSI-kódolás kerül alkalmazásra. A Add-Content viselkedése a PowerShellben (v6-os és újabb verziókban) ugyanaz, kivéve, hogy az alapértelmezett kódolás Utf8.

  • Export-Csv -Append megegyezik a meglévő kódolással, ha a célfájl anyagjegyzéket tartalmaz. A BOM hiányában Utf8 kódolást használ.

  • Start-Transcript -Append megegyezik az anyagjegyzéket tartalmazó fájlok meglévő kódolásával. BOM hiányában alapértelmezés szerint a Ascii kódolást használja. Ez a kódolás adatvesztést vagy karaktersérülést okozhat, ha az átiratban szereplő adatok többbájtos karaktereket tartalmaznak.

Karakterlánc adatokat BOM nélkül olvasó parancsmagok számára:

  • Get-Content és Import-PowerShellDataFile a Default ANSI-kódolást használja. Az ANSI az, amit a PowerShell-motor használ, amikor fájlból olvas be forráskódot.

  • Import-Csv, Import-Clixmlés Select-String feltételezi Utf8-at BOM hiányában.

Karakterkódolás a PowerShellben

A PowerShellben (7.1-s vagy újabb verzió) a Kódolás paraméter a következő értékeket támogatja:

  • ascii: Az ASCII (7 bites) karakterkészlet kódolását használja.
  • ansi: Az aktuális kultúra ANSI-kódlapjának kódolását használja. Ez a beállítás a PowerShell 7.4-ben lett hozzáadva.
  • bigendianunicode: UTF-16 formátumban kódolja a big-endian bájtsorrendet.
  • bigendianutf32: Az UTF-32 formátumot big-endian bájtsorrend használatával kódolja.
  • oem: Az alapértelmezett kódolást használja MS-DOS és konzolprogramokhoz.
  • unicode: Az UTF-16 formátumban kódol kis végű bájtsorrend használatával.
  • utf7: UTF-7 formátumban kódol.
  • utf8: UTF-8 formátumban kódol (nem BOM).
  • utf8BOM: Kódol UTF-8 formátumban bájtsorrendi jelöléssel (BOM)
  • utf8NoBOM: UTF-8 formátumban kódol byte order mark (BOM) nélkül
  • utf32: A UTF-32 formátumban, kis végű bájtsorrend alkalmazásával kódolja.

A PowerShell alapértelmezésként utf8NoBOM-re állítja be az összes kimenetet.

A PowerShell 6.2-től kezdődően a Kódolás paraméter lehetővé teszi a regisztrált kódlapok (például -Encoding 1251) numerikus azonosítóit vagy a regisztrált kódlapok sztringneveit (például -Encoding "windows-1251"). További információt a Encoding.CodePage.NET-dokumentációjában talál.

A PowerShell 7.4-től kezdve a ANSI paraméter értékével anélkül adhat meg numerikus azonosítót az aktuális kultúra ANSI-kódlapjához, hogy manuálisan kellene megadnia.

Az alapértelmezett kódolás módosítása

A PowerShell két alapértelmezett változóval rendelkezik, amelyek az alapértelmezett kódolási viselkedés módosítására használhatók.

  • $PSDefaultParameterValues
  • $OutputEncoding

További információért lásd: about_Preference_Variables.

A PowerShell 5.1-től kezdve az átirányítási operátorok (> és >>) meghívják a Out-File parancsmagot. Ezért beállíthatja az alapértelmezett kódolást a $PSDefaultParameterValues beállítási változó használatával, ahogyan az ebben a példában látható:

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

Az alábbi utasítással módosíthatja az alapértelmezett kódolást az Kódolás paramétert tartalmazó parancsmagok esetében.

$PSDefaultParameterValues['*:Encoding'] = 'utf8'

Fontos

Ha ezt a parancsot a PowerShell-profiljába helyezi, az az adott munkamenetre érvényes globális beállítás lesz, amely minden olyan parancsot és szkriptet érint, amely nem határoz meg explicit módon kódolást.

Hasonlóképpen, érdemes olyan parancsokat is belefoglalnia a szkriptekbe vagy modulokba, amelyeknek ugyanúgy kellene viselkedniük. Ezek a parancsok biztosítják, hogy a parancsmagok ugyanúgy viselkedjenek akkor is, ha egy másik felhasználó futtat egy másik számítógépen vagy a PowerShell egy másik verziójában.

Az automatikus változó $OutputEncoding befolyásolja a PowerShell külső programokkal való kommunikációhoz használt kódolását. Nincs hatással arra a kódolásra, amelyet a kimeneti átirányítási operátorok és a PowerShell-parancsmagok a fájlokba való mentéshez használnak.

Lásd még: