Чому Encoding.Default не слід використовувати ...
@ Рандалл використовує відповідь Encoding.Default
, однак Microsoft попереджає :
Різні комп’ютери можуть використовувати різні кодування як типові, а кодування за замовчуванням можуть змінюватися на одному комп’ютері. Якщо ви використовуєте кодування за замовчуванням для кодування та декодування даних, що передаються між комп'ютерами або отримані в різний час на одному комп’ютері, вони можуть перевести ці дані неправильно. Крім того, кодування, повернене властивістю за замовчуванням, використовує найкраще підходить резервне копіювання для відображення непідтримуваних символів на символи, підтримувані кодовою сторінкою. З цих причин використовувати кодування за замовчуванням не рекомендується. Щоб переконатися, що закодовані байти правильно розшифровані, слід використовувати кодування Unicode, наприклад UTF8Encoding або UnicodeEncoding. Ви також можете використовувати протокол вищого рівня, щоб переконатися, що той самий формат використовується для кодування та декодування.
Щоб перевірити, що таке кодування за замовчуванням, використовуйте Encoding.Default.WindowsCodePage
(у моєму випадку 1250 - і, на жаль, немає заздалегідь визначеного класу кодування CP1250, але об'єкт можна отримати як Encoding.GetEncoding(1250)
).
Encoding.ASCII
7-бітний, тому в моєму випадку він також не працює:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... і чому для цього слід використовувати кодування UTF-8 ...
Кодування по замовчуванням вводить в оману: .NET використовує UTF-8 всюди , як реальний дефолт (8bit кодувань застарівають до кінця 20 століття, перевірити є Console.OutputEncoding.EncodingName
*) , тому кожна константа ви визначаєте в коді UTF-8 кодуються за замовчуванням - так це слід використовувати, якщо джерело даних не перебуває в іншому кодуванні.
* Це UTF-8 в моєму випадку, що є прямою брехнею: chcp
з консолі Windows (cmd) повертається 852 - і цього не слід змінювати, оскільки локалізовані системні команди (наприклад, ping) мають цю кодову сторінку жорстко кодованою
Дотримуючись рекомендацій Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
Рекомендований іншими є примірником кодування UTF-8 і може також використовуватися безпосередньо або як
var utf8 = Encoding.UTF8 as UTF8Encoding;
... але він використовується не завжди
Кодування для байтових масивів повинно "просто працювати" в Unicode в західних країнах, але як тільки ви перемістите свою програму в деякі менш підтримувані регіони (наприклад, тут у Східній Європі), це справжній безлад: у Чехії за замовчуванням Windows використовують (у 2020 році!) MS нестандартний 852 (він же латинський-2) для консолі, 1250 як Windows OEM, UTF-8 (65001) як .NET (та інші) нові за замовчуванням, і ми повинні мати на увазі, що деякі західні 8-бітові ЄС Дані є ще у 1252 році, тоді як старий 8-бітовий західний стандарт для Східної Європи був ISO-8859-2 (він же латинський-2, але НЕ такий самий латинський-2, як 852). Використання ASCII означає текст, наповнений тофу та "?" тут. Тож до половини 21 століття, будь ласка, встановіть чітко UTF-8 .
searchResult.Properties["user"][0]
? Спробуйте віддати цеbyte[]
спочатку