Memahami pengodean file dalam Kode VS dan PowerShell
Saat menggunakan Visual Studio Code untuk membuat dan mengedit skrip PowerShell, penting bahwa file Anda disimpan menggunakan format pengodean karakter yang benar.
Apa itu pengodean file dan mengapa itu penting?
Visual Studio Code mengelola antarmuka antara manusia yang memasukkan string karakter ke dalam buffer dan membaca/menulis blok byte ke sistem file. Saat Visual Studio Code menyimpan file, ia menggunakan pengodean teks untuk memutuskan byte apa yang menjadi setiap karakter. Untuk informasi selengkapnya, lihat about_Character_Encoding.
Demikian pula, ketika PowerShell menjalankan skrip, PowerShell harus mengonversi byte dalam file menjadi karakter untuk membangun kembali file menjadi program PowerShell. Karena VS Code menulis file dan PowerShell membaca file, mereka perlu menggunakan sistem pengodean yang sama. Proses penguraian skrip PowerShell ini berjalan: byte ->characters ->tokens ->abstract sintaks tree ->execution.
Visual Studio Code dan PowerShell diinstal dengan konfigurasi pengodean default yang masuk akal. Namun, pengodean default yang digunakan oleh PowerShell telah berubah dengan rilis PowerShell 6. Untuk memastikan Anda tidak memiliki masalah menggunakan PowerShell atau ekstensi PowerShell di Visual Studio Code, Anda perlu mengonfigurasi pengaturan VISUAL Code dan PowerShell dengan benar.
Penyebab umum masalah pengodean
Masalah pengodean terjadi ketika pengodean Visual Studio Code atau file skrip Anda tidak cocok dengan pengodean PowerShell yang diharapkan. Tidak ada cara bagi PowerShell untuk secara otomatis menentukan pengodean file.
Anda lebih mungkin mengalami masalah pengodean saat menggunakan karakter yang tidak ada dalam set karakter ASCII 7-bit. Contohnya:
- Karakter non-huruf yang diperluas seperti em-dash (
—
), spasi tidak putus ("
) - Karakter latin beraksen (
É
,ü
) - Karakter non-latin seperti Sirilik (
Д
,Ц
) - Karakter CJK (
本
,화
,が
)
Alasan umum untuk masalah pengodean adalah:
- Pengodean Visual Studio Code dan PowerShell belum diubah dari defaultnya. Untuk PowerShell 5.1 ke bawah, pengodean default berbeda dari VS Code.
- Editor lain telah membuka dan menimpa file dalam pengodean baru. Ini sering terjadi dengan ISE.
- File diperiksa ke kontrol sumber dalam pengodean yang berbeda dari apa yang diharapkan VS Code atau PowerShell. Ini dapat terjadi ketika kolaborator menggunakan editor dengan konfigurasi pengodean yang berbeda.
Cara mengetahui kapan Anda memiliki masalah pengodean
Seringkali kesalahan pengodean muncul sebagai kesalahan penguraian dalam skrip. Jika Anda menemukan urutan karakter aneh dalam skrip Anda, ini bisa menjadi masalahnya. Dalam contoh di bawah ini, garis putus-putus (–
) muncul sebagai karakter â€"
:
Send-MailMessage : A positional parameter cannot be found that accepts argument 'Testing FuseMail SMTP...'.
At C:\Users\<User>\<OneDrive>\Development\PowerShell\Scripts\Send-EmailUsingSmtpRelay.ps1:6 char:1
+ Send-MailMessage â€"From $from â€"To $recipient1 â€"Subject $subject ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Send-MailMessage], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SendMailMessage
Masalah ini terjadi karena Visual Studio Code mengodekan karakter –
dalam UTF-8 sebagai byte 0xE2 0x80 0x93
. Ketika byte ini didekodekan sebagai Windows-1252, byte ini ditafsirkan sebagai karakter â€"
.
Beberapa urutan karakter aneh yang mungkin Anda lihat meliputi:
â€"
alih-alih–
(garis putus-putus)â€"
alih-alih—
(garis putus-putus)Ä2
MelainkanÄ
Â
alih-alihé
Melainkané
Referensi praktis ini mencantumkan pola umum yang menunjukkan masalah pengodean UTF-8/Windows-1252.
Bagaimana ekstensi PowerShell di VISUAL Code berinteraksi dengan pengodean
Ekstensi PowerShell berinteraksi dengan skrip dengan sejumlah cara:
- Ketika skrip diedit dalam Visual Studio Code, konten dikirim oleh Visual Studio Code ke ekstensi. Protokol Server Bahasa mengamanatkan bahwa konten ini ditransfer dalam UTF-8. Oleh karena itu, ekstensi tidak mungkin mendapatkan pengodean yang salah.
- Saat skrip dijalankan langsung di Konsol Terintegrasi, skrip dibaca dari file oleh PowerShell secara langsung. Jika pengodean PowerShell berbeda dari VS Code, sesuatu bisa salah di sini.
- Saat skrip yang terbuka di VISUAL Code mereferensikan skrip lain yang tidak terbuka di Visual Studio Code, ekstensi akan kembali memuat konten skrip tersebut dari sistem file. Ekstensi PowerShell default ke pengodean UTF-8, tetapi menggunakan tanda urutan byte, atau BOM, deteksi untuk memilih pengodean yang benar.
Masalah terjadi ketika mengasumsikan pengodean format BOM-less (seperti UTF-8 tanpa BOM dan Windows-1252). Ekstensi PowerShell default ke UTF-8. Ekstensi tidak dapat mengubah pengaturan pengodean Visual Studio Code. Untuk informasi selengkapnya, lihat masalah #824.
Memilih pengodean yang tepat
Sistem dan aplikasi yang berbeda dapat menggunakan pengodean yang berbeda:
- Di .NET Standard, di web, dan di dunia Linux, UTF-8 sekarang menjadi pengodean dominan.
- Banyak aplikasi .NET Framework menggunakan UTF-16. Untuk alasan historis, ini kadang-kadang disebut "Unicode", istilah yang sekarang mengacu pada standar luas yang mencakup UTF-8 dan UTF-16.
- Di Windows, banyak aplikasi asli yang mendahului Unicode terus menggunakan Windows-1252 secara default.
Pengodean unicode juga memiliki konsep tanda urutan byte (BOM). BOM terjadi di awal teks untuk memberi tahu dekoder yang mengodekan teks yang digunakan. Untuk pengodean multi-byte, BOM juga menunjukkan endianness pengodean. BOM dirancang untuk menjadi byte yang jarang terjadi dalam teks non-Unicode, memungkinkan tebakan yang masuk akal bahwa teks adalah Unicode ketika BOM ada.
BOM bersifat opsional dan adopsinya tidak populer di dunia Linux karena konvensi UTF-8 yang dapat diandalkan digunakan di mana-mana. Sebagian besar aplikasi Linux berasumsi bahwa input teks dikodekan dalam UTF-8. Meskipun banyak aplikasi Linux akan mengenali dan menangani BOM dengan benar, angka tidak, yang mengarah ke artefak dalam teks yang dimanipulasi dengan aplikasi tersebut.
Oleh karena itu:
- Jika Anda bekerja terutama dengan aplikasi Windows dan Windows PowerShell, Anda harus lebih memilih pengodean seperti UTF-8 dengan BOM atau UTF-16.
- Jika Anda bekerja di seluruh platform, Anda harus lebih memilih UTF-8 dengan BOM.
- Jika Anda bekerja terutama dalam konteks terkait Linux, Anda harus lebih memilih UTF-8 tanpa BOM.
- Windows-1252 dan latin-1 pada dasarnya adalah pengodean warisan yang harus Anda hindari jika memungkinkan. Namun, beberapa aplikasi Windows yang lebih lama mungkin bergantung padanya.
- Perlu juga dicatat bahwa penandatanganan skrip bergantung pada pengodean, yang berarti perubahan pengodean pada skrip yang ditandatangani akan memerlukan pengunduran diri.
Mengonfigurasi Visual Studio Code
Pengodean default VS Code adalah UTF-8 tanpa BOM.
Untuk mengatur pengodean VISUAL Code, buka pengaturan Visual Studio Code (Ctrl+,) dan atur "files.encoding"
pengaturan:
"files.encoding": "utf8bom"
Beberapa nilai yang mungkin adalah:
utf8
: [UTF-8] tanpa BOMutf8bom
: [UTF-8] dengan BOMutf16le
: Little endian [UTF-16]utf16be
: Big endian [UTF-16]windows1252
: [Windows-1252]
Anda harus mendapatkan dropdown untuk ini dalam tampilan GUI, atau penyelesaian untuk itu dalam tampilan JSON.
Anda juga dapat menambahkan yang berikut ini ke pengodean autodetect jika memungkinkan:
"files.autoGuessEncoding": true
Jika Anda tidak ingin pengaturan ini memengaruhi semua jenis file, VISUAL Code juga mengizinkan konfigurasi per bahasa. Buat pengaturan khusus bahasa dengan menempatkan pengaturan di [<language-name>]
bidang. Contohnya:
"[powershell]": {
"files.encoding": "utf8bom",
"files.autoGuessEncoding": true
}
Anda mungkin juga ingin mempertimbangkan untuk menginstal pelacak Gremlins untuk Visual Studio Code. Ekstensi ini mengungkapkan karakter Unicode tertentu yang mudah rusak karena tidak terlihat atau terlihat seperti karakter normal lainnya.
Mengonfigurasi PowerShell
Pengodean default PowerShell bervariasi tergantung pada versi:
- Di PowerShell 6+, pengodean default adalah UTF-8 tanpa BOM di semua platform.
- Di Windows PowerShell, pengodean default biasanya Windows-1252, yang merupakan ekstensi latin-1 (juga dikenal sebagai ISO 8859-1).
Di PowerShell 5+ Anda dapat menemukan pengodean default Anda dengan ini:
[psobject].Assembly.GetTypes() | Where-Object { $_.Name -eq 'ClrFacade'} |
ForEach-Object {
$_.GetMethod('GetDefaultEncoding', [System.Reflection.BindingFlags]'nonpublic,static').Invoke($null, @())
}
Skrip berikut dapat digunakan untuk menentukan penyimpulan sesi PowerShell Anda untuk skrip tanpa BOM.
$badBytes = [byte[]]@(0xC3, 0x80)
$utf8Str = [System.Text.Encoding]::UTF8.GetString($badBytes)
$bytes = [System.Text.Encoding]::ASCII.GetBytes('Write-Output "') + [byte[]]@(0xC3, 0x80) + [byte[]]@(0x22)
$path = Join-Path ([System.IO.Path]::GetTempPath()) 'encodingtest.ps1'
try
{
[System.IO.File]::WriteAllBytes($path, $bytes)
switch (& $path)
{
$utf8Str
{
return 'UTF-8'
break
}
default
{
return 'Windows-1252'
break
}
}
}
finally
{
Remove-Item $path
}
Dimungkinkan untuk mengonfigurasi PowerShell untuk menggunakan pengodean tertentu secara lebih umum menggunakan pengaturan profil. Lihat artikel berikut:
- @mklement0Jawaban tentang pengodean PowerShell di StackOverflow.
- @rkeithhillPosting blog tentang menangani input BOM-less UTF-8 di PowerShell.
PowerShell tidak dimungkinkan untuk menggunakan pengodean input tertentu. PowerShell 5.1 ke bawah, berjalan di Windows dengan lokal diatur ke en-US, default ke pengodean Windows-1252 saat tidak ada BOM. Pengaturan lokal lainnya mungkin menggunakan pengodean yang berbeda. Untuk memastikan interoperabilitas, yang terbaik adalah menyimpan skrip dalam format Unicode dengan BOM.
Penting
Alat lain yang Anda miliki yang menyentuh skrip PowerShell mungkin dipengaruhi oleh pilihan pengodean Anda atau mengodekan ulang skrip Anda ke pengodean lain.
Skrip yang ada
Skrip yang sudah ada di sistem file mungkin perlu dikodekan ulang ke pengodean baru yang Anda pilih. Di bilah bawah Visual Studio Code, Anda akan melihat label UTF-8. Klik untuk membuka bilah tindakan dan pilih Simpan dengan pengodean. Sekarang Anda dapat memilih pengodean baru untuk file tersebut. Lihat Pengodean Visual Studio Code untuk instruksi lengkap.
Jika Anda perlu mengodekan ulang beberapa file, Anda dapat menggunakan skrip berikut:
Get-ChildItem *.ps1 -Recurse | ForEach-Object {
$content = Get-Content -Path $_
Set-Content -Path $_.Fullname -Value $content -Encoding UTF8 -PassThru -Force
}
Lingkungan Skrip Terintegrasi PowerShell (ISE)
Jika Anda juga mengedit skrip menggunakan POWERShell ISE, Anda perlu menyinkronkan pengaturan pengodean Anda di sana.
ISE harus menghormati BOM, tetapi juga dimungkinkan untuk menggunakan refleksi untuk mengatur pengodean. Perhatikan bahwa ini tidak akan bertahan di antara startup.
Perangkat lunak kontrol sumber
Beberapa alat kontrol sumber, seperti git, mengabaikan pengodean; git hanya melacak byte. Lainnya, seperti Azure DevOps atau Mercurial, mungkin tidak. Bahkan beberapa alat berbasis git mengandalkan decoding teks.
Jika demikian, pastikan Anda:
- Konfigurasikan pengodean teks di kontrol sumber Anda agar sesuai dengan konfigurasi Visual Studio Code Anda.
- Pastikan semua file Anda diperiksa ke kontrol sumber dalam pengodean yang relevan.
- Waspadalah terhadap perubahan pada pengodean yang diterima melalui kontrol sumber. Tanda kunci dari ini adalah perbedaan yang menunjukkan perubahan tetapi di mana tampaknya tidak ada yang berubah (karena byte memiliki tetapi karakter belum).
Lingkungan kolaborator
Di atas mengonfigurasi kontrol sumber, pastikan kolaborator Anda pada file apa pun yang Anda bagikan tidak memiliki pengaturan yang menimpa pengodean Anda dengan mengodekan ulang file PowerShell.
Program lain
Program lain yang membaca atau menulis skrip PowerShell dapat mengodekannya kembali.
Beberapa contohnya adalah:
- Menggunakan clipboard untuk menyalin dan menempelkan skrip. Ini umum dalam skenario seperti:
- Menyalin skrip ke VM
- Menyalin skrip dari email atau halaman web
- Menyalin skrip ke dalam atau keluar dari dokumen Microsoft Word atau PowerPoint
- Editor teks lainnya, seperti:
- Notepad
- Vim
- Editor skrip PowerShell lainnya
- Utilitas pengeditan teks, seperti:
Get-Content
/Set-Content
/Out-File
- Operator pengalihan PowerShell seperti
>
dan>>
sed
/awk
- Program transfer file, seperti:
- Browser web, saat mengunduh skrip
- Berbagi file
Beberapa alat ini berurusan dengan byte daripada teks, tetapi yang lain menawarkan konfigurasi pengodean. Dalam kasus di mana Anda perlu mengonfigurasi pengodean, Anda perlu membuatnya sama dengan pengodean editor Anda untuk mencegah masalah.
Sumber daya lain tentang pengodean di PowerShell
Ada beberapa posting bagus lainnya tentang pengodean dan konfigurasi pengodean di PowerShell yang layak dibaca:
- about_Character_Encoding
- @mklement0Ringkasan pengodean PowerShell di StackOverflow
- Masalah sebelumnya dibuka pada VS Code-PowerShell untuk masalah pengodean:
- Joel klasik di Software menulis tentang Unicode
- Pengodean dalam .NET Standard