about_Character_Encoding

Deskripsi singkat

Menjelaskan cara PowerShell menggunakan pengodean karakter untuk input dan output data string.

Deskripsi panjang

Unicode adalah standar pengodean karakter di seluruh dunia. Sistem ini menggunakan Unicode secara eksklusif untuk manipulasi karakter dan string. Untuk deskripsi terperinci tentang semua aspek Unicode, lihat The Unicode Standard.

Windows mendukung set karakter Unicode dan tradisional. Kumpulan karakter tradisional, seperti halaman kode Windows, gunakan nilai 8-bit atau kombinasi nilai 8-bit untuk mewakili karakter yang digunakan dalam pengaturan bahasa atau wilayah geografis tertentu.

PowerShell menggunakan karakter Unicode yang ditetapkan secara default. Namun, beberapa cmdlet memiliki parameter Pengodean yang dapat menentukan pengodean untuk set karakter yang berbeda. Parameter ini memungkinkan Anda memilih pengodean karakter tertentu yang Anda butuhkan untuk interoperabilitas dengan sistem dan aplikasi lain.

Cmdlet berikut memiliki parameter Pengodean :

  • 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

Tanda urutan byte

Tanda urutan byte (BOM) adalah tanda tangan Unicode dalam beberapa byte pertama dari file atau aliran teks yang menunjukkan pengodean Unicode mana yang digunakan untuk data. Untuk informasi selengkapnya, lihat dokumentasi tanda urutan Byte.

Di Windows PowerShell, pengodean Unicode apa pun, kecuali UTF7, selalu membuat BOM. PowerShell (v6 dan lebih tinggi) default ke utf8NoBOM untuk semua output teks.

Untuk kompatibilitas keseluruhan terbaik, hindari menggunakan BOM dalam file UTF-8. Platform Unix dan utilitas warisan Unix juga digunakan pada Platform Windows tidak mendukung BOM.

Demikian pula, UTF7 pengodean harus dihindari. UTF-7 bukan pengodean Unicode standar dan ditulis tanpa BOM di semua versi PowerShell.

Membuat skrip PowerShell pada platform seperti Unix atau menggunakan editor lintas platform di Windows, seperti Visual Studio Code, menghasilkan file yang dikodekan menggunakan UTF8NoBOM. File-file ini berfungsi dengan baik di PowerShell, tetapi mungkin rusak di Windows PowerShell jika file berisi karakter non-Ascii.

Jika Anda perlu menggunakan karakter non-Ascii dalam skrip Anda, simpan sebagai UTF-8 dengan BOM. Tanpa BOM, Windows PowerShell salah menafsirkan skrip Anda sebagai dikodekan dalam halaman kode "ANSI" warisan. Sebaliknya, file yang memiliki UTF-8 BOM dapat bermasalah pada platform seperti Unix. Banyak alat Unix seperti cat, sed, awk, dan beberapa editor seperti gedit tidak tahu cara memperlakukan BOM.

Pengodean karakter di Windows PowerShell

Di PowerShell 5.1, parameter Pengodean mendukung nilai berikut:

  • Ascii Menggunakan set karakter Ascii (7-bit).
  • BigEndianUnicode Menggunakan UTF-16 dengan urutan byte big-endian.
  • BigEndianUTF32 Menggunakan UTF-32 dengan urutan byte big-endian.
  • Byte Mengodekan sekumpulan karakter ke dalam urutan byte.
  • Default Menggunakan pengodean yang sesuai dengan halaman kode aktif sistem (biasanya ANSI).
  • Oem Menggunakan pengodean yang sesuai dengan halaman kode OEM sistem saat ini.
  • String Sama seperti Unicode.
  • Unicode Menggunakan UTF-16 dengan urutan byte little-endian.
  • Unknown Sama seperti Unicode.
  • UTF32 Menggunakan UTF-32 dengan urutan byte little-endian.
  • UTF7 Menggunakan UTF-7.
  • UTF8 Menggunakan UTF-8 (dengan BOM).

Secara umum, Windows PowerShell menggunakan pengodean Unicode UTF-16LE secara default. Namun, pengodean default yang digunakan oleh cmdlet di Windows PowerShell tidak konsisten.

Catatan

Menggunakan pengodean Unicode apa pun, kecuali UTF7, selalu membuat BOM.

Untuk cmdlet yang menulis output ke file:

  • Out-File dan operator > pengalihan dan >> membuat UTF-16LE, yang terutama berbeda dari Set-Content dan Add-Content.

  • New-ModuleManifest dan Export-CliXml juga membuat file UTF-16LE.

  • Ketika file target kosong atau tidak ada, Set-Content dan Add-Content gunakan Default pengodean. Default adalah pengodean yang ditentukan oleh halaman kode warisan ANSI lokal sistem aktif.

  • Export-CsvAscii membuat file tetapi menggunakan pengodean yang berbeda saat menggunakan parameter Tambahkan (lihat di bawah).

  • Export-PSSession membuat file UTF-8 dengan BOM secara default.

  • New-Item -Type File -Value membuat file UTF-8 tanpa BOM.

  • Send-MailMessage menggunakan pengodean Ascii secara default.

  • Start-TranscriptUtf8 membuat file dengan BOM. Ketika parameter Tambahkan digunakan, pengodean dapat berbeda (lihat di bawah).

Untuk perintah yang ditambahkan ke file yang sudah ada:

  • Out-File -Append>> dan operator pengalihan tidak mencoba mencocokkan pengodean konten file target yang ada. Sebaliknya, mereka menggunakan pengodean default kecuali parameter Pengodean digunakan. Anda harus menggunakan pengodean asli file saat menambahkan konten.

  • Dengan tidak adanya parameter Pengodean eksplisit, Add-Content mendeteksi pengodean yang ada dan secara otomatis menerapkannya ke konten baru. Jika konten yang ada tidak memiliki BOM, Default pengodean ANSI digunakan. Perilakunya Add-Content sama di PowerShell (v6 dan lebih tinggi) kecuali pengodean defaultnya adalah Utf8.

  • Export-Csv -Append cocok dengan pengodean yang ada saat file target berisi BOM. Dengan tidak adanya BOM, bom menggunakan Utf8 pengodean.

  • Start-Transcript -Append cocok dengan pengodean file yang ada yang menyertakan BOM. Dengan tidak adanya BOM, ini default untuk Ascii pengodean. Pengodean ini dapat mengakibatkan kehilangan data atau kerusakan karakter ketika data dalam transkrip berisi karakter multibyte.

Untuk cmdlet yang membaca data string tanpa adanya BOM:

  • Get-Content dan Import-PowerShellDataFile menggunakan pengodean Default ANSI. ANSI juga merupakan apa yang digunakan mesin PowerShell saat membaca kode sumber dari file.

  • Import-Csv, Import-CliXml, dan Select-String mengasumsikan Utf8 dengan tidak adanya BOM.

Pengodean karakter di PowerShell

Di PowerShell (v7.1 dan yang lebih tinggi), parameter Pengodean mendukung nilai berikut:

  • ascii: Menggunakan pengodean untuk set karakter ASCII (7-bit).
  • bigendianunicode: Mengodekan dalam format UTF-16 menggunakan urutan byte big-endian.
  • bigendianutf32: Mengodekan dalam format UTF-32 menggunakan urutan byte big-endian.
  • oem: Menggunakan pengodean default untuk MS-DOS dan program konsol.
  • unicode: Mengodekan dalam format UTF-16 menggunakan urutan byte little-endian.
  • utf7: Mengodekan dalam format UTF-7.
  • utf8: Mengodekan dalam format UTF-8 (tanpa BOM).
  • utf8BOM: Mengodekan dalam format UTF-8 dengan Byte Order Mark (BOM)
  • utf8NoBOM: Mengodekan dalam format UTF-8 tanpa Byte Order Mark (BOM)
  • utf32: Mengodekan dalam format UTF-32 menggunakan urutan byte little-endian.

PowerShell default ke utf8NoBOM untuk semua output.

Dimulai dengan PowerShell 6.2, parameter Pengodean juga memungkinkan ID numerik halaman kode terdaftar (seperti -Encoding 1251) atau nama string halaman kode terdaftar (seperti -Encoding "windows-1251"). Untuk informasi selengkapnya, lihat dokumentasi .NET untuk Encoding.CodePage.

Mengubah pengodean default

PowerShell memiliki dua variabel default yang dapat digunakan untuk mengubah perilaku pengodean default.

  • $PSDefaultParameterValues
  • $OutputEncoding

Untuk informasi selengkapnya, lihat about_Preference_Variables.

Dimulai di PowerShell 5.1, operator pengalihan (> dan >>) memanggil Out-File cmdlet. Oleh karena itu, Anda dapat mengatur pengodean defaultnya menggunakan variabel preferensi seperti yang $PSDefaultParameterValues ditunjukkan dalam contoh ini:

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

Gunakan pernyataan berikut untuk mengubah pengodean default untuk semua cmdlet yang memiliki parameter Pengodean .

$PSDefaultParameterValues['*:Encoding'] = 'utf8'

Penting

Menempatkan perintah ini di profil PowerShell Anda membuat preferensi pengaturan sesi-global yang memengaruhi semua perintah dan skrip yang tidak secara eksplisit menentukan pengodean.

Demikian pula, Anda harus menyertakan perintah tersebut dalam skrip atau modul yang ingin Anda jaga dengan cara yang sama. Menggunakan perintah ini memastikan bahwa cmdlet berperilaku sama bahkan ketika dijalankan oleh pengguna lain, di komputer yang berbeda, atau di versi PowerShell yang berbeda.

Variabel $OutputEncoding otomatis memengaruhi pengodean yang digunakan PowerShell untuk berkomunikasi dengan program eksternal. Ini tidak berpengaruh pada pengodean yang digunakan operator pengalihan output dan cmdlet PowerShell untuk menyimpan ke file.

Lihat juga