Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
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, 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:
-
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 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 producenta OEM systemu. -
StringTak samo jakUnicode. -
UnicodeUżywa formatu UTF-16 z kolejnością bajtów little-endian. -
UnknownTak samo jakUnicode. -
UTF32Używa formatu UTF-32 z kolejnością bajtów little-endian. -
UTF7Używa protokołu UTF-7. -
UTF8Uż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-Fileoraz operatory>przekierowania i>>tworzą kod UTF-16LE, który różni się w szczególności odSet-ContentiAdd-Content.New-ModuleManifestaExport-Clixmltakże tworzyć pliki UTF-16LE.Gdy plik docelowy jest pusty lub nie istnieje,
Set-ContentiAdd-ContentużyjDefaultkodowania.Defaultto kodowanie określone przez starszą stronę kodu ANSI starszej wersji ustawień regionalnych aktywnego systemu.Export-Csvprogram tworzyAsciipliki, ale używa innego kodowania podczas używania parametru Append (zobacz poniżej).Export-PSSessionDomyślnie tworzy pliki UTF-8 z modelem BOM.New-Item -Type File -ValueTworzy plik UTF-8 bez protokołu BOM.Send-MailMessagedomyślnie używaAsciikodowania.Start-TranscripttworzyUtf8pliki 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 program wykrywa istniejące kodowanie i automatycznie stosuje go do nowej zawartości. Jeśli istniejąca zawartość nie ma modelu BOM,
Defaultużywane jest kodowanie ANSI. Zachowanie funkcjiAdd-Contentjest takie samo w programie PowerShell (w wersji 6 lub nowszej), z wyjątkiem domyślnego kodowania toUtf8.Export-Csv -Appenddopasuje istniejące kodowanie, gdy plik docelowy zawiera obiekt BOM. W przypadku braku modelu BOM używaUtf8kodowania.Start-Transcript -Appendodpowiada 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-ContentiImport-PowerShellDataFileużywaDefaultkodowania 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-ClixmliSelect-StringzakładająUtf8brak 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.