about_Character_Encoding

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 Standardban talá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.

A következő parancsmagok kódolási paramétere van:

  • 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 byte-order-mark (BOM) egy Unicode-aláírás 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ó: Byte order mark documentation.

A Windows PowerShellben minden Unicode-kódolás, kivéve UTF7, mindig létrehoz egy anyagjegyzéket. A PowerShell (v6-os és újabb) alapértelmezés szerint az utf8NoBOM összes szöveges kimenetre vonatkozik.

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 a 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 platformfüggetlen szerkesztő használatával Windowson, például Visual Studio Code-on, egy kódolt UTF8NoBOMfá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 néhány szerkesztő, például gedit nem tudja, 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 Az UTF-16-ot használja a big-endian bájtsorrenddel.
  • BigEndianUTF32 UTF-32-t használ a big-endian bájtsorrenddel.
  • Byte Egy karakterkészletet bájtok sorozatába kódol.
  • 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 Unicodea .
  • Unicode Az UTF-16-ot használja a kis végű bájtsorrenddel.
  • Unknown Ugyanaz, mint Unicodea .
  • UTF32 Az UTF-32-t használja 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 az Unicode UTF-16LE kódolást használja. A Windows PowerShell parancsmagjai által használt alapértelmezett kódolás azonban nem konzisztens.

Feljegyzés

Bármilyen Unicode-kódolást használ, 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átorokat > , és >> hozza létre az UTF-16LE-t, amely különösen különbözik a Set-ContentAdd-Content.

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

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

  • Export-Csvfájlokat hoz létreAscii, de más kódolást használ a 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 BOM-less UTF-8 fájlt hoz létre.

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

  • Start-Transcript fájlokat hoz létre Utf8 egy anyagjegyzékkel. A Hozzáfűzés 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 az átirányítási >> operátor nem próbálja meg egyezni 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ási paraméter hiányában észleli a meglévő kódolást, Add-Content és automatikusan alkalmazza az új tartalomra. Ha a meglévő tartalom nem tartalmaz anyagjegyzéket, Default a rendszer ANSI-kódolást használ. A viselkedése Add-Content ugyanaz a PowerShellben (v6 és újabb), kivéve az alapértelmezett kódolást Utf8.

  • Export-Csv -Append megfelel a meglévő kódolásnak, ha a célfájl AJ-t tartalmaz. A BOM hiányában kódolást használ Utf8 .

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

A sztringadatokat BOM hiányában olvasó parancsmagok esetén:

  • Get-Content és Import-PowerShellDataFile az ANSI-kódolást Default 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ételezzük, hogy Utf8 nincs anyagjegyzék.

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: UTF-32 formátumban kódolja a big-endian bájtsorrendet.
  • oem: Az MS-DOS és a konzolprogramok alapértelmezett kódolását használja.
  • unicode: UTF-16 formátumban kódolja a kis végű bájtsorrendet.
  • utf7: UTF-7 formátumban kódol.
  • utf8: UTF-8 formátumban kódol (nem BOM).
  • utf8BOM: UTF-8 formátumban kódol byte order mark (BOM)
  • utf8NoBOM: UTF-8 formátumban kódol byte order mark (BOM) nélkül
  • utf32: UTF-32 formátumban kódolja a kis végű bájtsorrendet.

A PowerShell alapértelmezés szerint az utf8NoBOM összes kimenetre vonatkozóan jelenik meg.

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 AnsiKódolás 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ó: 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 beállítási változó használatával, ahogyan az ebben a $PSDefaultParameterValues 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 a Kódolás paramétert tartalmazó parancsmagok esetében.

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

Fontos

Ha ezt a parancsot a PowerShell-profilban helyezi el, az a munkamenet-globális beállítás, amely minden olyan parancsot és szkriptet érint, amely nem határoz meg explicit módon kódolást.

Hasonlóképpen, olyan parancsokat is be kell foglalnia a szkriptekbe vagy modulokba, amelyeket ugyanúgy szeretne viselkedni. 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 hatással van arra a kódolásra, amelyet a PowerShell használ a külső programokkal való kommunikációhoz. 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