Asıl sorun: her komutun kodlaması ayrı
Windows PowerShell 5.1’de neredeyse her komutun kendi varsayılan kodlaması vardır: Get-Content BOM’suz dosyaları ANSI (Türkçe Windows’ta Windows-1254) olarak okur, Out-File ve > UTF-16 yazar, Set-Content ANSI yazar, Export-Csv ise ASCII. PowerShell 7 bunu birleştirdi ve her yerde BOM’suz UTF-8 kullanır.
Önce
Kullanıcı;Departman;Şehir Şule Çelik;Satış;İstanbul Oğuz Işık;Satın alma;Eskişehir
Sonra
Kullanıcı;Departman;Şehir Şule Çelik;Satış;İstanbul Oğuz Işık;Satın alma;Eskişehir
Dosyaları doğru okuyun ve yazın
Get-Content veri.csv -Encoding UTF8BOM olmasa da UTF-8 dosyaları doğru okur.Set-Content,Out-FileveAdd-Contentile UTF-8 yazmak için-Encoding UTF8kullanın – 5.1’de her zaman BOM’lu yazılır.- ASCII varsayılanı Türkçe harfleri
?yapar; onun yerineExport-Csv veri.csv -Encoding UTF8 -NoTypeInformationkullanın. - Tüm komutlar için tek seferde: betiğin başına
$PSDefaultParameterValues['*:Encoding'] = 'utf8'ekleyin. - Eski bir Türkçe ANSI dosyayı okumanız gerekirse:
Get-Content eski.txt -Encoding Default(5.1) ya da PowerShell 7’de-Encoding windows-1254.
Invoke-RestMethod ve Invoke-WebRequest ile web istekleri
Sunucu Content-Type içinde karakter seti belirtmezse Windows PowerShell 5.1 yanıtı ISO-8859-1 olarak çözer. UTF-8 yanıtlarda ş yerine ÅŸ çıkar. Çözüm: yanıtı bayt olarak alıp kendiniz çözün, örneğin [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
Özel karakterli betik dosyaları
Betiği BOM’suz UTF-8 kaydederseniz Windows PowerShell 5.1 onu ANSI olarak okur. Write-Host 'Çağrı' gibi metinlerdeki harfler ÇaÄŸrı olarak görünür. .ps1 dosyalarını BOM’lu UTF-8 kaydedin – VS Code’da durum çubuğundaki kodlamadan, Notepad++ içinde Encoding menüsündeki UTF-8-BOM seçeneğiyle.
Konsol
Yalnızca konsol penceresi ü yerine ├╝ gibi karakterler gösteriyorsa dosya çoğunlukla sağlamdır – konsol UTF-8’i DOS kod sayfası olarak okuyordur (Türkçe Windows’ta genelde 857). Bu kalıp hakkında daha fazlası. Çıktıyı [Console]::OutputEncoding = [Text.Encoding]::UTF8 ile değiştirin. Dış programlara aktardığınız çıktı için ayrıca $OutputEncoding = [Text.Encoding]::UTF8 ayarlayın.
Dosya zaten bozuk yazıldıysa yukarıdaki kutuya bırakın: Mojibuster ÅŸ ve benzerlerini onarır, ANSI dosyaları UTF-8’e çevirir. Dosyada zaten soru işareti varsa metin kayıptır – bkz. Türkçe harfler yerine soru işareti.
Sık sorulan sorular
Hangi PowerShell sürümünü kullanıyorum?
$PSVersionTable.PSVersion gösterir. 5.1 Windows’a yerleşik Windows PowerShell’dir; 7 ve sonrası yalnızca PowerShell adını taşır ve varsayılan olarak UTF-8 kullanır.
Excel PowerShell’den çıkan CSV’mi neden yanlış açıyor?
PowerShell 7 BOM’suz UTF-8 yazar, Excel bunu tanımaz. -Encoding utf8BOM kullanın ya da dosyayı Mojibuster’da BOM’lu kaydedin. Ayrıntı için Excel’de Türkçe karakter sorunu.
chcp 65001 gerekir mi?
Yalnızca konsol kod sayfasına uyan programlar için. PowerShell içinde [Console]::OutputEncoding yeterlidir. Konsolda ├╝ veya ┼ş görürseniz metni Mojibuster onarır: Mac ve konsolda Türkçe karakter sorunu.