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
, awk
i 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 jakUnicode
.Unicode
Używa formatu UTF-16 z kolejnością bajtów little-endian.Unknown
Tak samo jakUnicode
.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 odSet-Content
iAdd-Content
.New-ModuleManifest
aExport-CliXml
także tworzyć pliki UTF-16LE.Gdy plik docelowy jest pusty lub nie istnieje,
Set-Content
iAdd-Content
użyjDefault
kodowania.Default
to kodowanie określone przez starszą stronę kodu ANSI starszej wersji ustawień regionalnych aktywnego systemu.Export-Csv
program tworzyAscii
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żywaAscii
kodowania.Start-Transcript
tworzyUtf8
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 funkcjiAdd-Content
jest takie samo w programie PowerShell (w wersji 6 lub nowszej), z wyjątkiem domyślnego kodowania toUtf8
.Export-Csv -Append
dopasuje istniejące kodowanie, gdy plik docelowy zawiera obiekt BOM. W przypadku braku modelu BOM używaUtf8
kodowania.Start-Transcript -Append
odpowiada istniejącemu kodowaniu plików, które zawierają model BOM. W przypadku braku modelu BOM domyślnie kodujeAscii
. 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
iImport-PowerShellDataFile
używaDefault
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-CliXml
iSelect-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.