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).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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla