Mengapa Pengkodean. Kesalahan tidak boleh digunakan ...
@ Randall menggunakan jawaban Encoding.Default
, namun Microsoft memunculkan peringatan terhadapnya :
Komputer yang berbeda dapat menggunakan penyandian yang berbeda sebagai default, dan penyandian default dapat berubah pada satu komputer. Jika Anda menggunakan Pengkodean default untuk menyandikan dan mendekode data yang dialirkan antar komputer atau diambil pada waktu yang berbeda di komputer yang sama, itu mungkin menerjemahkan data itu secara tidak benar. Selain itu, penyandian yang dikembalikan oleh properti Default menggunakan fallback paling cocok untuk memetakan karakter yang tidak didukung ke karakter yang didukung oleh halaman kode. Karena alasan ini, tidak disarankan menggunakan pengkodean default. Untuk memastikan bahwa byte yang dikodekan didekodekan dengan benar, Anda harus menggunakan pengkodean Unicode, seperti UTF8Encoding atau UnicodeEncoding. Anda juga bisa menggunakan protokol tingkat yang lebih tinggi untuk memastikan bahwa format yang sama digunakan untuk penyandian dan decoding.
Untuk memeriksa apa pengkodean default, gunakan Encoding.Default.WindowsCodePage
(1250 dalam kasus saya - dan sayangnya, tidak ada kelas pengkodean CP1250 yang telah ditentukan, tetapi objek dapat diambil sebagai Encoding.GetEncoding(1250)
).
Encoding.ASCII
adalah 7bit, jadi tidak berfungsi, dalam kasus saya:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... dan mengapa pengkodean UTF-8 harus digunakan sebagai gantinya ...
Pengkodean default menyesatkan: .NET menggunakan UTF-8 di mana-mana sebagai standar nyata (pengodean 8-bit menjadi usang pada akhir abad ke-20, periksa mis. Console.OutputEncoding.EncodingName
*) Sehingga setiap konstanta yang Anda tetapkan dalam kode tersebut adalah UTF-8 yang disandikan secara default - jadi ini harus digunakan kecuali sumber data dalam pengkodean yang berbeda.
* Ini adalah UTF-8 dalam kasus saya yang merupakan kebohongan langsung: chcp
dari windows console (cmd) mengembalikan 852 - dan ini tidak boleh diubah, karena perintah sistem yang terlokalisasi (seperti ping) memiliki codepage ini hardcoded
Mengikuti rekomendasi Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
direkomendasikan oleh orang lain adalah contoh pengkodean uf UTF-8 dan dapat juga digunakan secara langsung atau sebagai
var utf8 = Encoding.UTF8 as UTF8Encoding;
... tapi itu tidak selalu digunakan
Pengkodean untuk byte array seharusnya "hanya berfungsi" di Unicode di negara-negara Barat, tetapi segera setelah Anda memindahkan program Anda ke beberapa daerah yang kurang didukung (seperti di sini di Eropa Timur), itu adalah kekacauan yang nyata: di Republik Ceko Windows default menggunakan (pada tahun 2020!) MS non-standar 852 (alias Latin-2) untuk konsol, 1250 sebagai Windows OEM, UTF-8 (65001) sebagai .NET (dan lain-lain) default baru dan kita harus ingat bahwa beberapa EU 8bit barat data masih dalam 1252, sedangkan standar barat 8bit lama untuk Eropa Timur adalah ISO-8859-2 (alias Latin-2, tapi BUKAN sama Latin-2 seperti 852). Menggunakan ASCII berarti teks yang penuh dengan tahu dan '?' sini. Jadi hingga paruh abad ke-21, harap tetapkan UTF-8 secara eksplisit .
searchResult.Properties["user"][0]
? Coba castingbyte[]
terlebih dahulu