ASCIIEncoding.ASCII.GetBytes () Возrotation неожиданного значения

Этот код C # …

string s = "\u00C0"; byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s); Trace.WriteLine(BitConverter.ToString(bytes)); 

производит следующий вывод:

 3F 

Почему выход не C0?

Потому что \u00c0 не является ASCII (диапазон 0-127). В результате он закодирован так, как будто это знак вопроса – ? (0x3F).

См. Статью MSDN об ASCIIEncoding :

ASCIIEncoding соответствует кодовой странице Windows 20127. Поскольку ASCII представляет собой 7-битную кодировку, символы ASCII ограничены самыми младшими 128 символами Unicode, начиная с U + 0000 и заканчивая U + 007F . Если вы используете кодировщик по умолчанию, возвращаемый свойством Encoding.ASCII или конструктором ASCIIEncoding, символы вне этого диапазона заменяются вопросительным знаком (?) Перед выполнением операции кодирования .

Кажется, что вам нужна последовательность байтов, которая представляет строку символов Unicode. Очевидно, что байты будут зависеть от кодировки. Поскольку вы ожидаете, что C0 будет одним из байтов, он немного сужает варианты. Вот UTF16LE, который, конечно, два байта, так как \u00c0 полностью представляет символ BMP :

 string s = "\u00C0"; byte[] bytes = Encoding.Unicode.GetBytes(s); Trace.WriteLine(BitConverter.ToString(bytes)); 

Вы должны прочитать «Абсолютный минимум». Каждый разработчик программного обеспечения абсолютно уверен, должен знать о юникоде и наборах символов (никаких оправданий!) Джоэл Спольски

Первый шаг: вы оцениваете символ unicode для строки, затем конвертируете его в ASCII (но это unicode). Затем вы пытаетесь преобразовать его, используя конвертер unicode.

Следующий пример делает все возможности, чтобы сделать мой ответ более ясным:

  static void Main(string[] args) { string s = "\u00C0"; Console.WriteLine(s); byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s); Console.WriteLine(BitConverter.ToString(bytes)); Console.WriteLine(ASCIIEncoding.ASCII.GetString(bytes)); Console.WriteLine("Again"); bytes = Encoding.UTF8.GetBytes(s); Console.WriteLine(BitConverter.ToString(bytes)); Console.WriteLine(Encoding.UTF8.GetString(bytes)); Console.ReadLine(); } 

И выход:

 A 3F ? Again C3-80 A 

Btw определение BitConverter.GetBytes:

Преобразует числовое значение каждого элемента указанного массива байтов в его эквивалентное шестнадцатеричное представление строки.

  • Почему современный Perl избегает UTF-8 по умолчанию?
  • Regex: что такое InCombiningDiacriticalMarks?
  • Проблема с кодировкой Java FileReader
  • Печать символов Unicode в приглашении PowerShell
  • установка UTF-8 в java и csv-файле
  • Разница между UTF-8 и UTF-16?
  • Как скомпилировать исходный файл java, который кодируется как «UTF-8»?
  • Символы в строке изменились после загрузки HTML из Интернета
  • UTF8 в / из широкого преобразования символов в STL
  • как установить emoji по unicode в текстовом режиме?
  • Разница между порядком байдара большого конечного и маленького Endian Byte
  • Interesting Posts

    Почему элементы массива отформатированы как нули, когда они умножаются на 1/2 или 1/3?

    В чем разница между `sorted (list)` vs `list.sort ()`?

    Новый знак Google в Android

    Инкрементный анализ JSON в C #

    Почему этот код разворота строки C вызывает ошибку сегментации?

    Сколько объектов String будет создано при использовании знака «плюс»?

    Является ли основная нить такой же, как stream пользовательского интерфейса?

    Жасмин: обратный вызов Async не вызывался в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL

    Как я могу заставить Skype не оставаться свернутым в панели задач?

    Существуют ли эквиваленты C ++ для функций протокола ввода-вывода протокола Buffer в Java?

    Как передать вывод команды другим командам?

    java.lang.ClassNotFoundException при работе в IntelliJ IDEA

    Неразумно ли игнорировать предупреждение gcc / clang «-Смесительные скобки»?

    NoClassDefFoundError для кода в библиотеке Java на Android

    по дате в mongodb

    Давайте будем гением компьютера.