about_Character_Encoding

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, zobacz 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 kilka poleceń cmdlet ma parametr Kodowanie , który może określać 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 mają 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) jest podpisem 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 dowolne kodowanie Unicode, z wyjątkiem UTF7, zawsze tworzy obiekt BOM. Wartość domyślna programu PowerShell (wersja 6 lub nowsza) dotyczy wszystkich danych wyjściowych utf8NoBOM tekstu.

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.

UTF7 Podobnie należy unikać kodowania. 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 polecenia 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 modelu BOM program Windows PowerShell błędnie interpretuje skrypt jako kodowany na 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 Kodowanie 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 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 producenta OEM systemu.
  • String Tak samo jak Unicode.
  • Unicode Używa formatu UTF-16 z kolejnością bajtów little-endian.
  • Unknown Tak samo jak Unicode.
  • UTF32 Używa formatu UTF-32 z kolejnością bajtów little-endian.
  • UTF7 Używa protokołu UTF-7.
  • UTF8 Używa formatu UTF-8 (z modelem BOM).

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

Uwaga

Przy użyciu 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 oraz operatory > przekierowania i >> tworzą kod UTF-16LE, który różni się w szczególności od Set-Content i Add-Content.

  • New-ModuleManifest a Export-CliXml także tworzyć pliki UTF-16LE.

  • Gdy plik docelowy jest pusty lub nie istnieje, Set-Content i Add-Content użyj Default kodowania. Default to kodowanie określone przez starszą stronę kodu ANSI starszej wersji ustawień regionalnych aktywnego systemu.

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

  • Export-PSSession Domyślnie tworzy pliki UTF-8 z modelem BOM.

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

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

  • Start-Transcript tworzy Utf8 pliki z modelem 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>> operator przekierowania nie próbuje 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 Add-Content kodowania program wykrywa istniejące kodowanie i automatycznie stosuje go do nowej zawartości. Jeśli istniejąca zawartość nie ma modelu BOM, Default używane jest kodowanie ANSI. Zachowanie funkcji Add-Content jest takie samo w programie PowerShell (w wersji 6 lub nowszej), z wyjątkiem domyślnego kodowania to Utf8.

  • Export-Csv -Append dopasuje istniejące kodowanie, gdy plik docelowy zawiera obiekt BOM. W przypadku braku modelu BOM używa Utf8 kodowania.

  • Start-Transcript -Append odpowiada istniejącemu kodowaniu plików, które zawierają model BOM. W przypadku braku modelu BOM domyślnie koduje 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 ciągu w przypadku braku modelu BOM:

  • Get-Content i Import-PowerShellDataFile używa Default kodowania ANSI. Usługa ANSI jest również używana przez aparat programu PowerShell podczas odczytywania kodu źródłowego z plików.

  • Import-Csv, Import-CliXmli Select-String zakładają Utf8 brak BOM.

Kodowanie znaków w programie PowerShell

W programie PowerShell (wersja 7.1 lub nowsza ) parametr Kodowanie obsługuje następujące wartości:

  • ascii: używa kodowania dla zestawu znaków ASCII (7-bitowych).
  • ansi: używa kodowania dla strony kodowej ANSI 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 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 formacie UTF-8 (bez BOM).
  • utf8BOM: Koduje w formacie UTF-8 za pomocą języka Byte Order Mark (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 domyślnie ma wartość dla wszystkich danych wyjściowych utf8NoBOM .

Począwszy od programu PowerShell 6.2, parametr Kodowanie umożliwia również numeryczne identyfikatory zarejestrowanych stron kodu (takich jak ) lub nazwy ciągów zarejestrowanych stron kodu (na przykład -Encoding 1251-Encoding "windows-1251"). Aby uzyskać więcej informacji, zobacz dokumentację platformy .NET dotyczącą pliku Encoding.CodePage.

Począwszy od programu PowerShell 7.4, można użyć Ansi wartości parametru Kodowanie , 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ą Out-File polecenie cmdlet . W związku z tym można ustawić domyślne kodowanie ich przy użyciu zmiennej $PSDefaultParameterValues preferencji, 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 z parametrem Kodowanie .

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

Ważne

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 $OutputEncoding automatyczna 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 też