Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
-
AsciiUżywa zestawu znaków Ascii (7-bitowego). -
BigEndianUnicodeUżywa formatu UTF-16 z kolejnością bajtów big-endian. -
BigEndianUTF32używa formatu UTF-32 z kolejnością bajtów w trybie big-endian. -
ByteKoduje zestaw znaków w sekwencji bajtów. -
DefaultUżywa kodowania odpowiadającego aktywnej stronie kodu systemu (zwykle ANSI). -
OemUżywa kodowania odpowiadającego bieżącej stronie kodowej OEM systemu. -
Stringtak samo jakUnicode. -
Unicodeużywa UTF-16 w formacie little-endian. -
Unknowntak samo jakUnicode. -
UTF32Używa UTF-32 z kolejnością bajtów little-endian. -
UTF7używa protokołu UTF-7. -
UTF8używa UTF-8 (z BOM).
Ogólnie rzecz biorąc, program Windows PowerShell domyślnie używa kodowania UTF-16LE
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-Filei operatory przekierowania>i>>tworzą UTF-16LE, co szczególnie różni się odSet-ContentiAdd-Content.New-ModuleManifestiExport-Clixmlrównież tworzą pliki UTF-16LE.Gdy plik docelowy jest pusty lub nie istnieje,
Set-ContentiAdd-Contentużywać kodowaniaDefault.Defaultjest kodowaniem określonym przez stronę kodową ANSI zgodną z ustawieniami regionalnymi aktywnego systemu.Export-Csvtworzy plikiAscii, ale używa innego kodowania podczas korzystania z parametru Append (zobacz poniżej).Export-PSSessiondomyślnie tworzy pliki w formacie UTF-8 z BOM.New-Item -Type File -Valuetworzy plik UTF-8 bez protokołu BOM.Send-MailMessagedomyślnie używa kodowaniaAscii.Start-Transcripttworzy plikiUtf8za 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 -Appendi 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 Kodowanie
Add-Contentwykrywa istniejące kodowanie i automatycznie stosuje go do nowej zawartości. Jeśli istniejąca zawartość nie ma BOM, zostanie użyte kodowanie ANSIDefault. ZachowanieAdd-Contentjest takie samo w programie PowerShell (w wersji 6 lub nowszej), z wyjątkiem że domyślne kodowanie toUtf8.Export-Csv -Appendpasuje do istniejącego kodowania, gdy plik docelowy zawiera BOM. W przypadku braku znacznika kolejności bajtów (BOM) używa kodowaniaUtf8.Start-Transcript -Appendpasuje do istniejącego kodowania plików, które obejmują BOM. W przypadku braku znacznika BOM, stosowane jest kodowanieAscii. 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-ContentiImport-PowerShellDataFileużywają kodowania ansiDefault. ANSI jest również tym, czego używa silnik programu PowerShell podczas odczytywania kodu źródłowego z plików.Import-Csv,Import-ClixmliSelect-StringzakładająUtf8w 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
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.