Aracılığıyla paylaş


about_Character_Encoding

Kısa açıklama

PowerShell'in dize verilerinin girişi ve çıkışı için karakter kodlamasını nasıl kullandığını açıklar.

Uzun açıklama

Unicode, dünya çapında bir karakter kodlama standardıdır. Sistem, karakter ve dize işleme için yalnızca Unicode kullanır. Unicode'un tüm yönlerinin ayrıntılı açıklaması için Bkz. Unicode Standardı.

Windows, Unicode ve geleneksel karakter kümelerini destekler. Windows kod sayfaları gibi geleneksel karakter kümeleri, belirli bir dil veya coğrafi bölge ayarlarında kullanılan karakterleri temsil etmek için 8 bit değerleri veya 8 bit değerlerin birleşimlerini kullanır.

PowerShell varsayılan olarak bir Unicode karakter kümesi kullanır. Ancak, birkaç cmdlet'in farklı bir karakter kümesi için kodlama belirtebilen bir Kodlama parametresi vardır. Bu parametre, diğer sistem ve uygulamalarla birlikte çalışabilirlik için ihtiyacınız olan karakter kodlamasını seçmenize olanak tanır.

Aşağıdaki cmdlet'ler Kodlama parametresine sahiptir:

  • 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

Bayt-sipariş işareti

Bayt-sıra işareti (BOM), bir dosyanın veya metin akışının ilk birkaç bayt içinde yer alan ve veriler için hangi Unicode kodlamasının kullanıldığını gösteren bir Unicode imzasıdır . Daha fazla bilgi için Bayt sipariş işareti belgelerine bakın.

Windows PowerShell'de, dışında UTF7herhangi bir Unicode kodlaması her zaman bir ürün reçetesi oluşturur. PowerShell (v6 ve üzeri) tüm metin çıktıları utf8NoBOM için varsayılan olarak kullanılır.

Genel olarak en iyi uyumluluk için, UTF-8 dosyalarında ürün reçetelerini kullanmaktan kaçının. Windows Platformlarında da kullanılan Unix platformları ve Unix-heritage yardımcı programları, ürün reçetelerini desteklemez.

Benzer şekilde, UTF7 kodlamadan kaçınılmalıdır. UTF-7 standart bir Unicode kodlaması değildir ve PowerShell'in tüm sürümlerinde bom olmadan yazılır.

Unix benzeri bir platformda PowerShell betikleri oluşturmak veya Visual Studio Code gibi Windows'ta platformlar arası bir düzenleyici kullanmak, kullanılarak UTF8NoBOMkodlanmış bir dosyayla sonuçlanır. Bu dosyalar PowerShell'de sorunsuz çalışır, ancak dosya Ascii olmayan karakterler içeriyorsa Windows PowerShell'de bozulabilir.

Betiklerinizde Ascii olmayan karakterler kullanmanız gerekiyorsa, bunları BOM ile UTF-8 olarak kaydedin. Ürün reçetesi olmadan, Windows PowerShell betiğinizi eski "ANSI" kod sayfasında kodlanmış olarak yanlış yorumlar. Buna karşılık, UTF-8 BOM'a sahip dosyalar Unix benzeri platformlarda sorunlu olabilir. , cat, sedve gibi awkbirçok Unix aracı ve bazı gedit düzenleyiciler BOM'u nasıl ele aldıracaklarını bilmez.

Windows PowerShell'de karakter kodlama

PowerShell 5.1'de Kodlama parametresi aşağıdaki değerleri destekler:

  • Ascii Ascii (7 bit) karakter kümesini kullanır.
  • BigEndianUnicode UTF-16'yi büyük endian bayt düzeniyle kullanır.
  • BigEndianUTF32 UTF-32'yi büyük endian bayt düzeniyle kullanır.
  • Byte Bir karakter kümesini bayt dizisine kodlar.
  • Default Sistemin etkin kod sayfasına (genellikle ANSI) karşılık gelen kodlamayı kullanır.
  • Oem Sistemin geçerli OEM kod sayfasına karşılık gelen kodlamayı kullanır.
  • String ile Unicodeaynı.
  • Unicode UtF-16'nın küçük endian bayt sırasını kullanır.
  • Unknown ile Unicodeaynı.
  • UTF32 UtF-32'yi little-endian bayt düzeniyle kullanır.
  • UTF7 UTF-7 kullanır.
  • UTF8 UTF-8 kullanır (BOM ile).

Genel olarak, Windows PowerShell varsayılan olarak Unicode UTF-16LE kodlamasını kullanır. Ancak, Windows PowerShell'de cmdlet'ler tarafından kullanılan varsayılan kodlama tutarlı değildir.

Not

dışında UTF7herhangi bir Unicode kodlaması kullanarak her zaman bir BOM oluşturur.

Dosyalara çıktı yazan cmdlet'ler için:

  • Out-File ve yeniden yönlendirme işleçleri > ile >> utf-16LE oluşturur. Bu, ve'den Set-ContentAdd-Contentönemli ölçüde farklıdır.

  • New-ModuleManifest ve Export-Clixml ayrıca UTF-16LE dosyaları oluşturun.

  • Hedef dosya boş olduğunda veya mevcut Set-Content olmadığında kodlamayı Add-Content kullanın Default . Default , etkin sistem yerel ayarının ANSI eski kod sayfası tarafından belirtilen kodlamadır.

  • Export-Csvdosyaları oluşturur Ascii ancak Append parametresi kullanılırken farklı kodlama kullanır (aşağıya bakın).

  • Export-PSSession varsayılan olarak BOM ile UTF-8 dosyaları oluşturur.

  • New-Item -Type File -Value bom olmayan bir UTF-8 dosyası oluşturur.

  • Send-MailMessage varsayılan olarak kodlama kullanır Ascii .

  • Start-Transcript bir ÜRÜN REÇETESI ile dosya oluşturur Utf8 . Append parametresi kullanıldığında kodlama farklı olabilir (aşağıya bakın).

Var olan bir dosyaya eklenen komutlar için:

  • Out-File -Append >> ve yeniden yönlendirme işleci, mevcut hedef dosyanın içeriğinin kodlamasını eşleştirmeye çalışmaz. Bunun yerine, Kodlama parametresi kullanılmadığı sürece varsayılan kodlamayı kullanırlar. İçerik eklerken özgün kodlama dosyalarını kullanmanız gerekir.

  • Açık bir Kodlama parametresi olmadığında, Add-Content mevcut kodlamayı algılar ve yeni içeriğe otomatik olarak uygular. Mevcut içerikte ürün reçetesi yoksa ANSI Default kodlaması kullanılır. Add-Content varsayılan kodlamanın olması dışında, davranışı PowerShell'de (v6 ve üzeri) aynıdırUtf8.

  • Export-Csv -Append hedef dosya bir BOM içerdiğinde mevcut kodlamayla eşleşir. Bom olmadığında kodlamayı kullanır Utf8 .

  • Start-Transcript -Append , ürün reçetesi içeren dosyaların mevcut kodlaması ile eşleşir. Ürün reçetesi olmadığında varsayılan olarak kodlama olur Ascii . Bu kodlama, transkriptteki veriler çok baytlı karakterler içerdiğinde veri kaybına veya karakter bozulmasına neden olabilir.

Ürün reçetesi olmadığında dize verilerini okuyan cmdlet'ler için:

  • Get-Content ve Import-PowerShellDataFile ANSI kodlamasını Default kullanır. ANSI, PowerShell altyapısının dosyalardan kaynak kodu okurken kullandığı özelliktir.

  • Import-Csv, Import-Clixmlve Select-String ürün reçetesinin yokluğunda varsayın Utf8 .

PowerShell'de karakter kodlama

PowerShell'de (v7.1 ve üzeri), Kodlama parametresi aşağıdaki değerleri destekler:

  • ascii: ASCII (7 bit) karakter kümesi için kodlamayı kullanır.
  • ansi: Geçerli kültürün ANSI kod sayfasının kodlamasını kullanır. Bu seçenek PowerShell 7.4'e eklendi.
  • bigendianunicode: Büyük endian bayt sırasını kullanarak UTF-16 biçiminde kodlar.
  • bigendianutf32: Büyük endian bayt sırasını kullanarak UTF-32 biçiminde kodlar.
  • oem: MS-DOS ve konsol programları için varsayılan kodlamayı kullanır.
  • unicode: Little-endian bayt sırasını kullanarak UTF-16 biçiminde kodlar.
  • utf7: UTF-7 biçiminde kodlar.
  • utf8: UTF-8 biçiminde kodlar (BOM yok).
  • utf8BOM: Bayt Sırası İşareti (BOM) ile UTF-8 biçiminde kodlar
  • utf8NoBOM: Bayt Sipariş İşareti (BOM) olmadan UTF-8 biçiminde kodlar
  • utf32: Little-endian bayt sırasını kullanarak UTF-32 biçiminde kodlar.

Tüm çıkışlar utf8NoBOM için PowerShell varsayılan olarak kullanılır.

PowerShell 6.2'den başlayarak Kodlama parametresi, kayıtlı kod sayfalarının (gibi-Encoding 1251) sayısal kimliklerine veya kayıtlı kod sayfalarının dize adlarına da (gibi-Encoding "windows-1251") izin verir. Daha fazla bilgi için Encoding.CodePage için .NET belgelerine bakın.

PowerShell 7.4'den başlayarak Kodlama parametresinin değerini ANSI kullanarak geçerli kültürün ANSI kod sayfasının sayısal kimliğini el ile belirtmek zorunda kalmadan geçirebilirsiniz.

Varsayılan kodlamayı değiştirme

PowerShell,varsayılan kodlama davranışını değiştirmek için kullanılabilecek iki varsayılan değişkene sahiptir.

  • $PSDefaultParameterValues
  • $OutputEncoding

Daha fazla bilgi için bkz . about_Preference_Variables.

PowerShell 5.1'den başlayarak, yeniden yönlendirme işleçleri (> ve >>) cmdlet'ini Out-File çağırır. Bu nedenle, bu örnekte gösterildiği gibi tercih değişkenini kullanarak bunların varsayılan kodlamasını $PSDefaultParameterValues ayarlayabilirsiniz:

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

Kodlama parametresine sahip tüm cmdlet'ler için varsayılan kodlamayı değiştirmek için aşağıdaki deyimi kullanın.

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

Önemli

Bu komutu PowerShell profilinize yerleştirmek, tercihi açıkça kodlama belirtmeyen tüm komutları ve betikleri etkileyen bir oturum genel ayarı yapar.

Benzer şekilde, betiklerinize veya modüllerinize aynı şekilde davranmasını istediğiniz bu tür komutları eklemeniz gerekir. Bu komutların kullanılması, cmdlet'lerin başka bir kullanıcı, farklı bir bilgisayarda veya farklı bir PowerShell sürümünde çalıştırıldığında bile aynı şekilde davranmasını sağlar.

Otomatik değişken $OutputEncoding , PowerShell'in dış programlarla iletişim kurmak için kullandığı kodlamayı etkiler. Çıkış yeniden yönlendirme işleçlerinin ve PowerShell cmdlet'lerinin dosyalara kaydetmek için kullandığı kodlama üzerinde hiçbir etkisi yoktur.

Ayrıca bkz.