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 összes aspektusának részletes leírását lásd a Unicode Szabványcímű dokumentumban.

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 byte-order-mark

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 létrehoz egy BOM-ot. 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 nagy-végű bájtsorrenddel.
  • BigEndianUTF32 UTF-32-t használ nagyvégű bájtsorrenddel.
  • Byte karaktereket 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ármely Unicode-kódolás használata, kivéve UTF7, mindig létrehoz egy anyagjegyzéket.

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 BOM-mal (Byte sorrendjelzéssel). 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ájtsorrend-jelzőt (BOM), akkor Default ANSI-kódolást használ. 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 Ascii kódolás történik. Ez a kódolás adatvesztést vagy karaktersérülést okozhat, ha az átiratban szereplő adatok többbájtos karaktereket tartalmaznak.

Azokat a parancsmagokat illetően, amelyek karakterláncadatokat olvasnak be BOM hiányában:

  • 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, hogy a Utf8 nem rendelkezik AOM-sel.

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: Az UTF-16 formátumú kódolást a big-endian bájtsorrend alkalmazásával végzi.
  • bigendianutf32: A UTF-32 formátumban, a big-endian bájtsorrendet használva kódol.
  • oem: Az alapértelmezett kódolást használja MS-DOS és konzolprogramokhoz.
  • unicode: UTF-16 formátumú kódolás 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: UTF-8 formátumban kódolódik bájt sorrendi jel (BOM) használatával
  • utf8NoBOM: UTF-8 formátumban kódol byte order mark (BOM) nélkül
  • utf32: UTF-32 formátumban kódolja a kis endian bájtsorrendet használva.

A PowerShell alapértelmezés szerint a utf8NoBOM értéket használja az összes kimenethez.

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

Amennyiben ezt a parancsot a PowerShell-profilba helyezi, az egy globális munkamenet-beállítás lesz, amely hatással van minden olyan parancsra és szkriptre, amelyek nem adnak meg kifejezetten kódolást.

Hasonlóképpen, bele kell foglalnia olyan parancsokat a szkriptekbe vagy modulokba, amelyekre azt szeretné, hogy ugyanúgy viselkedjenek. 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