Почему не следует использовать Encoding.Default ...
Ответ Рэндалла использует Encoding.Default
, однако Microsoft выдвигает против него предупреждение :
Разные компьютеры могут использовать разные кодировки по умолчанию, и кодировка по умолчанию может меняться на одном компьютере. Если вы используете кодировку по умолчанию для кодирования и декодирования данных, передаваемых между компьютерами или получаемых в разное время на одном и том же компьютере, это может привести к неправильному переводу этих данных. Кроме того, кодировка, возвращаемая свойством Default, использует наиболее подходящий запасной вариант для сопоставления неподдерживаемых символов с символами, поддерживаемыми кодовой страницей. По этим причинам использование кодировки по умолчанию не рекомендуется. Чтобы обеспечить правильное декодирование закодированных байтов, следует использовать кодировку Unicode, например UTF8Encoding или UnicodeEncoding. Вы также можете использовать протокол более высокого уровня, чтобы гарантировать, что тот же формат используется для кодирования и декодирования.
Чтобы проверить, что такое кодировка по умолчанию, используйте Encoding.Default.WindowsCodePage
(1250 в моем случае - и, к сожалению, нет предопределенного класса кодировки CP1250, но объект может быть получен как Encoding.GetEncoding(1250)
).
Encoding.ASCII
7bit, так что в моем случае это тоже не работает:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... и почему вместо этого следует использовать кодировку UTF-8 ...
Кодировка по умолчанию вводит в заблуждение: .NET использует UTF-8 повсеместно в качестве реального значения по умолчанию (8-битные кодировки устарели к концу 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 UF и может также использоваться напрямую или как
var utf8 = Encoding.UTF8 as UTF8Encoding;
... но это не всегда используется
Кодировка для байтовых массивов должна «просто работать» в Unicode в западных странах, но как только вы перенесете свою программу в некоторые менее поддерживаемые регионы (например, здесь, в Восточной Европе), это настоящий беспорядок: в Чешской Республике по умолчанию Windows использует (в 2020 году!) MS нестандартный 852 (он же Latin-2) для консоли, 1250 как Windows OEM, UTF-8 (65001) как .NET (и другие) новый по умолчанию, и мы должны помнить, что некоторые западные 8-битные ЕС данные все еще в 1252 году, в то время как старый 8-битный западный стандарт для Восточной Европы был ISO-8859-2 (он же Latin-2, но НЕ тот же самый Latin-2, как 852). Использование ASCII означает текст, полный тофу и '?' Вот. Так что до половины 21-го века, пожалуйста, установите UTF-8 явно .
searchResult.Properties["user"][0]
? Попробуйтеbyte[]