Neden Kodlama Varsayılan kullanılmamalıdır ...
@ Randall'ın cevabı kullanır Encoding.Default
, ancak Microsoft buna karşı bir uyarı yapar :
Farklı bilgisayarlar varsayılan olarak farklı kodlamalar kullanabilir ve varsayılan kodlama tek bir bilgisayarda değişebilir. Bilgisayarlar arasında aktarılan veya aynı bilgisayarda farklı zamanlarda alınan verileri kodlamak ve kodunu çözmek için Varsayılan kodlamayı kullanırsanız, bu veriler yanlış çevrilebilir. Ayrıca, Default özelliği tarafından döndürülen kodlama, desteklenmeyen karakterleri kod sayfası tarafından desteklenen karakterlerle eşleştirmek için en uygun yedeklemeyi kullanır. Bu nedenlerle, varsayılan kodlamanın kullanılması önerilmez. Kodlanmış baytların doğru bir şekilde kodunun çözülmesini sağlamak için UTF8Encoding veya UnicodeEncoding gibi bir Unicode kodlaması kullanmalısınız. Aynı formatın kodlama ve kod çözme için kullanıldığından emin olmak için daha üst düzey bir protokol de kullanabilirsiniz.
Varsayılan kodlamanın ne olduğunu kontrol etmek için kullanın Encoding.Default.WindowsCodePage
(benim durumumda 1250 - ve ne yazık ki, önceden tanımlanmış bir CP1250 kodlaması sınıfı yoktur, ancak nesne olarak alınabilir Encoding.GetEncoding(1250)
).
Encoding.ASCII
7bit, bu yüzden benim durumumda da çalışmıyor:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... ve neden UTF-8 kodlaması kullanılmalı ...
Varsayılan kodlama yanıltıcıdır: .NET, gerçek varsayılan olarak UTF-8'i her yerde kullanır (8 bit kodlamalar 20. yüzyılın sonunda geçersiz hale gelir, yani kontrol edin Console.OutputEncoding.EncodingName
*), böylece kodda tanımladığınız her sabit varsayılan olarak UTF-8 olarak kodlanır - yani bu, veri kaynağı farklı kodlamada olmadığı sürece kullanılmalıdır.
* Bu benim durumumda doğrudan yalan olan UTF-8: chcp
Windows konsolundan (cmd) 852 döndürür - ve bu değiştirilmemelidir, çünkü yerelleştirilmiş sistem komutları (ping gibi) bu kod sayfasına sabit kodlanmıştır
Microsoft'un önerisine göre:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
başkaları tarafından önerilen UTF-8 kodlamasının bir örneğidir ve doğrudan veya
var utf8 = Encoding.UTF8 as UTF8Encoding;
... ama her zaman kullanılmaz
Bayt dizileri için kodlama, Batı ülkelerinde Unicode'da "sadece çalışmalıdır", ancak programınızı daha az desteklenen bölgelere (Doğu Avrupa'daki gibi) taşıdığınızda, bu gerçek bir karışıklıktır: Çek Cumhuriyeti'nde Windows varsayılanları kullanımı (2020'de!) Konsol için MS standart dışı 852 (diğer adıyla Latin-2), Windows OEM olarak 1250, .NET (ve diğerleri) olarak UTF-8 (65001) yeni varsayılan ve bazı batı AB 8 bitlerinin veriler hala 1252'de iken, Doğu Avrupa için eski 8 bit batı standardı ISO-8859-2 idi (Latin-2 olarak da bilinir, ancak 852 ile aynı Latin-2 DEĞİLDİR). ASCII kullanmak tofu ve '?' buraya. Bu yüzden 21. yüzyılın yarısına kadar lütfen UTF-8'i açıkça ayarlayın .
searchResult.Properties["user"][0]
?byte[]
İlk döküm yapmayı deneyin