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).
  • 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.

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ż