Udostępnij za pośrednictwem


o_Kodowaniu_Znaków

Krótki opis

Opisuje sposób, w jaki program PowerShell używa kodowania znaków dla danych wejściowych i wyjściowych ciągów.

Długi opis

Unicode to światowy standard kodowania znaków. System używa formatu Unicode wyłącznie do manipulowania znakami i ciągami. Aby uzyskać szczegółowy opis wszystkich aspektów unicode, zapoznaj się z Standard Unicode.

System Windows obsługuje zestawy znaków Unicode i tradycyjne. Tradycyjne zestawy znaków, takie jak strony kodowe systemu Windows, używają wartości 8-bitowych lub kombinacji 8-bitowych wartości do reprezentowania znaków używanych w określonym języku lub ustawieniach regionu geograficznego.

Program PowerShell domyślnie używa zestawu znaków Unicode. Jednak niektóre polecenia cmdlet mają parametr Kodowanie, który pozwala określić kodowanie dla innego zestawu znaków. Ten parametr umożliwia wybranie konkretnego kodowania znaków potrzebnego do współdziałania z innymi systemami i aplikacjami.

Następujące polecenia cmdlet zawierają parametr Kodowanie:

  • 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

Znak porządkowy bajtów

BOM (byte-order-mark) to podpis Unicode w kilku pierwszych bajtach pliku lub strumienia tekstowego, który wskazuje kodowanie Unicode używane dla danych. Aby uzyskać więcej informacji, zobacz dokumentację znacznika kolejności bajtów.

W programie Windows PowerShell wszystkie kodowanie Unicode, z wyjątkiem UTF7, zawsze tworzy obiekt BOM. Domyślna wartość w programie PowerShell (wersja 6 lub nowsza) to utf8NoBOM dla całego wyjścia tekstowego.

Aby uzyskać najlepszą ogólną zgodność, unikaj używania modułów BOM w plikach UTF-8. Platformy Unix i narzędzia dziedzictwa Unix używane również na platformach Windows nie obsługują modułów BOM.

Podobnie należy unikać kodowania UTF7. UTF-7 nie jest standardowym kodowaniem Unicode i jest zapisywany bez modelu BOM we wszystkich wersjach programu PowerShell.

Tworzenie skryptów programu PowerShell na platformie podobnej do systemu Unix lub używanie edytora międzyplatformowego w systemie Windows, takiego jak Visual Studio Code, powoduje kodowanie pliku przy użyciu UTF8NoBOM. Te pliki działają prawidłowo w programie PowerShell, ale mogą zostać przerwane w programie Windows PowerShell, jeśli plik zawiera znaki inne niż Ascii.

Jeśli musisz użyć znaków innych niż Ascii w skryptach, zapisz je jako UTF-8 z BOM. Bez znacznika BOM, Windows PowerShell błędnie interpretuje Twój skrypt jako zakodowany w starszej stronie kodowej "ANSI". Z drugiej strony pliki, które mają model UTF-8 BOM, mogą być problematyczne na platformach przypominających system Unix. Wiele narzędzi systemu Unix, takich jak cat, sed, awki niektóre edytory, takie jak gedit, nie wiedzą, jak traktować model BOM.

Kodowanie znaków w programie Windows PowerShell

W programie PowerShell 5.1 parametr kodowania obsługuje następujące wartości:

  • Ascii Używa zestawu znaków Ascii (7-bitowego).
  • BigEndianUnicode Używa formatu UTF-16 z kolejnością bajtów big-endian.
  • BigEndianUTF32 używa formatu UTF-32 z kolejnością bajtów w trybie big-endian.
  • Byte Koduje zestaw znaków w sekwencji bajtów.
  • Default Używa kodowania odpowiadającego aktywnej stronie kodu systemu (zwykle ANSI).
  • Oem Używa kodowania odpowiadającego bieżącej stronie kodowej OEM systemu.
  • String tak samo jak Unicode.
  • Unicode używa UTF-16 w formacie little-endian.
  • Unknown tak samo jak Unicode.
  • UTF32 Używa UTF-32 z kolejnością bajtów little-endian.
  • UTF7 używa protokołu UTF-7.
  • UTF8 używa UTF-8 (z BOM).

Ogólnie rzecz biorąc, program Windows PowerShell domyślnie używa kodowania UTF-16LE Unicode. Jednak domyślne kodowanie używane przez polecenia cmdlet w programie Windows PowerShell nie jest spójne.

Uwaga

Używając dowolnego kodowania Unicode, z wyjątkiem UTF7, zawsze tworzy BOM.

W przypadku poleceń cmdlet, które zapisują dane wyjściowe do plików:

  • Out-File i operatory przekierowania > i >> tworzą UTF-16LE, co szczególnie różni się od Set-Content i Add-Content.

  • New-ModuleManifest i Export-Clixml również tworzą pliki UTF-16LE.

  • Gdy plik docelowy jest pusty lub nie istnieje, Set-Content i Add-Content używać kodowania Default. Default jest kodowaniem określonym przez stronę kodową ANSI zgodną z ustawieniami regionalnymi aktywnego systemu.

  • Export-Csv tworzy pliki Ascii, ale używa innego kodowania podczas korzystania z parametru Append (zobacz poniżej).

  • Export-PSSession domyślnie tworzy pliki w formacie UTF-8 z BOM.

  • New-Item -Type File -Value tworzy plik UTF-8 bez protokołu BOM.

  • Send-MailMessage domyślnie używa kodowania Ascii.

  • Start-Transcript tworzy pliki Utf8 za pomocą modelu BOM. Gdy jest używany parametr Append, kodowanie może być inne (patrz poniżej).

W przypadku poleceń dołączających do istniejącego pliku:

  • Out-File -Append i operator przekierowania >> nie próbują dopasować kodowania zawartości istniejącego pliku docelowego. Zamiast tego używają kodowania domyślnego, chyba że jest używany parametr Kodowanie. Podczas dołączania zawartości należy użyć oryginalnego kodowania plików.

  • W przypadku braku jawnego parametru KodowanieAdd-Content wykrywa istniejące kodowanie i automatycznie stosuje go do nowej zawartości. Jeśli istniejąca zawartość nie ma BOM, zostanie użyte kodowanie ANSI Default. Zachowanie Add-Content jest takie samo w programie PowerShell (w wersji 6 lub nowszej), z wyjątkiem że domyślne kodowanie to Utf8.

  • Export-Csv -Append pasuje do istniejącego kodowania, gdy plik docelowy zawiera BOM. W przypadku braku znacznika kolejności bajtów (BOM) używa kodowania Utf8.

  • Start-Transcript -Append pasuje do istniejącego kodowania plików, które obejmują BOM. W przypadku braku znacznika BOM, stosowane jest kodowanie Ascii. To kodowanie może spowodować utratę danych lub uszkodzenie znaków, gdy dane w transkrypcji zawierają znaki wielobajtowe.

W przypadku poleceń cmdlet odczytujących dane tekstowe przy braku BOM:

  • Get-Content i Import-PowerShellDataFile używają kodowania ansi Default. ANSI jest również tym, czego używa silnik programu PowerShell podczas odczytywania kodu źródłowego z plików.

  • Import-Csv, Import-Clixmli Select-String zakładają Utf8 w przypadku braku BOM.

Kodowanie znaków w programie PowerShell

W programie PowerShell (w wersji 7.1 lub nowszej) parametr Encoding obsługuje następujące wartości:

  • ascii: używa kodowania zestawu znaków ASCII (7-bitowych).
  • ansi: używa kodowania strony kodowej ANSI dla bieżącej kultury. Ta opcja została dodana w programie PowerShell 7.4.
  • bigendianunicode: koduje w formacie UTF-16 przy użyciu kolejności bajtów w trybie big-endian.
  • bigendianutf32: Koduje w formacie UTF-32 przy użyciu kolejności bajtów big-endian.
  • oem: używa domyślnego kodowania dla programów MS-DOS i konsoli.
  • unicode: Koduje w formacie UTF-16 przy użyciu kolejności bajtów little-endian.
  • utf7: koduje w formacie UTF-7.
  • utf8: koduje w kodowaniu UTF-8 (bez znacznika BOM).
  • utf8BOM: koduje w formacie UTF-8 za pomocą znacznika kolejności bajtów (BOM)
  • utf8NoBOM: koduje w formacie UTF-8 bez znaku kolejności bajtów (BOM)
  • utf32: Koduje w formacie UTF-32 przy użyciu kolejności bajtów little-endian.

Program PowerShell ustawia domyślnie utf8NoBOM dla wszystkich danych wyjściowych.

Począwszy od programu PowerShell 6.2, parametr Kodowanie umożliwia również użycie numerycznych identyfikatorów zarejestrowanych stron kodowych (na przykład -Encoding 1251) lub nazw tekstowych zarejestrowanych stron kodowych (na przykład -Encoding "windows-1251"). Aby uzyskać więcej informacji, zobacz dokumentację platformy .NET dotyczącą Encoding.CodePage.

Począwszy od programu PowerShell 7.4, można użyć wartości parametru kodowania , aby przekazać identyfikator liczbowy dla strony kodowej ANSI bieżącej kultury bez konieczności ręcznego określania go.

Zmiana domyślnego kodowania

Program PowerShell ma dwie zmienne domyślne, których można użyć do zmiany domyślnego zachowania kodowania.

  • $PSDefaultParameterValues
  • $OutputEncoding

Aby uzyskać więcej informacji, zobacz about_Preference_Variables.

Począwszy od programu PowerShell 5.1, operatory przekierowania (> i >>) wywołają polecenie cmdlet Out-File. W związku z tym można ustawić domyślne kodowanie ich przy użyciu zmiennej preferencji $PSDefaultParameterValues, jak pokazano w tym przykładzie:

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

Użyj następującej instrukcji, aby zmienić domyślne kodowanie dla wszystkich poleceń cmdlet, które mają parametr Kodowanie.

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

Ważny

Umieszczenie tego polecenia w profilu programu PowerShell sprawia, że preferencja jest ustawieniem globalnym sesji, które wpływa na wszystkie polecenia i skrypty, które nie określają jawnie kodowania.

Podobnie należy uwzględnić takie polecenia w skryptach lub modułach, które mają zachowywać się w taki sam sposób. Za pomocą tych poleceń upewnij się, że polecenia cmdlet zachowują się tak samo, nawet jeśli są uruchamiane przez innego użytkownika, na innym komputerze lub w innej wersji programu PowerShell.

Zmienna automatyczna $OutputEncoding wpływa na kodowanie używane przez program PowerShell do komunikowania się z programami zewnętrznymi. Nie ma to wpływu na kodowanie używane przez operatory przekierowania danych wyjściowych i polecenia cmdlet programu PowerShell do zapisywania w plikach.

Zobacz także