Понимание кодировки текста (In .Net)
Я очень мало сделал с кодировкой текста. По правде говоря, я даже не знаю, что именно это значит.
Например, если у меня есть что-то вроде:
Dim myStr as String = "Hello"
Это "закодировано" в памяти в определенном формате? Этот формат зависит от того, какой язык я использую?
Если бы я был в другой стране, например, в Китае, и у меня была бы строка китайского языка (мандарин? Мои извинения, если я здесь использую неправильные слова), был бы следующий код (который я использовал хорошо для английских строк) все еще работать так же?
System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
return encoding.GetBytes(str);
Или он потеряет всякий смысл, когда вы преобразуете эту строку.Net в кодировку UTF8, если это преобразование недопустимо?
Наконец, я работаю с.Net уже несколько лет, и я никогда не видел, не слышал и не должен был что-либо делать с Кодировкой. Я исключение или это не обычное дело?
3 ответа
Строковый класс.NET кодирует строки с использованием UTF16 - это означает 2 байта на символ (хотя он позволяет специальным комбинациям двух символов формировать один 4-байтовый символ, так называемые "суррогатные пары").
UTF8, с другой стороны, будет использовать переменное число байтов, необходимое для представления конкретного символа Unicode, то есть только один байт для обычных символов ASCII, но, возможно, 3 байта для китайского символа. Обе кодировки позволяют представлять все символы Unicode, поэтому между ними всегда существует сопоставление - оба представляют собой различные двоичные представления (т.е. для хранения в памяти или на диске) одного и того же (Unicode) набора символов.
Поскольку не все символы Unicode могли вписаться в исходные 2 байта, зарезервированные UTF-16, формат также позволяет обозначать комбинацию из двух символов UTF-16 для формирования 4-байтовых символов - сформированный таким образом символ называется "суррогатным" или суррогатная пара и представляет собой пару 16-битных значений кодирования Unicode, которые вместе представляют один символ.
UTF-8 не имеет этой проблемы, так как число байтов на символ Unicode не является фиксированным. Хороший общий обзор UTF-8, UTF-16 и спецификаций можно найти здесь.
Отличный обзор / введение в кодировку символов Unicode - Абсолютный минимум, который должен знать каждый разработчик программного обеспечения.
Прежде всего: не отчаивайтесь, вы не одиноки. Осведомленность о трактовке кодировки символов и представления текста в целом - это, к сожалению, необычная вещь, но нет лучшего времени, чтобы начать обучение, чем прямо сейчас!
В современных системах, включая.NET, текстовые строки представляются в памяти посредством некоторого кодирования кодовых точек Unicode. Это просто цифры. Кодовая точка для символа A
является 65
, Кодовая точка для авторского права (c)
является 169
, Кодовая точка для тайской цифры шесть: 3670
,
Термин "кодирование" относится к тому, как эти числа представлены в памяти. Существует ряд стандартных кодировок, которые используются для того, чтобы текстовое представление могло оставаться непротиворечивым при передаче данных из одной системы в другую.
Простым стандартом кодирования является UCS-2, согласно которому кодовая точка хранится в необработанном виде в виде 16-битного слова. Это ограничено из-за того, что он может представлять только кодовые точки 0000-FFFF
и такой диапазон не охватывает всю ширину кодовых точек Unicode.
UTF-16 - это кодировка, используемая внутри.NET String
учебный класс. Большинство символов вписываются в одно 16-битное слово, но значения больше FFFF
кодируются с использованием суррогатных пар (см. вики). Из-за этой схемы кодирования кодовые точки D800-DFFF
не может быть включено в UTF-16.
UTF-8, пожалуй, самая популярная кодировка, используемая сегодня, по ряду причин, которые описаны в статье Wiki.
UTF - это определенный тип кодирования с несколькими различными размерами. Каждый тип кодировки определяет, сколько памяти и какое представление в этой памяти занимают символы.
Обычно мы работаем с Unicode и Ascii.
Юникод составляет 2 байта на символ.
Ascii составляет 1 байт на символ.
Ascii может быть представлен в Unicode. однако Unicode не может быть представлен в ascii без кодирования.
Кодировка UTF использует специальный символ "%", чтобы сообщить вам, что ниже приведено шестнадцатеричное значение закодированного символа.
Например,%20 - это символ 32, который на самом деле является пробелом.
http://www.google.com?q=space%20character
размещение этого URL в браузере UTF-8 расшифровывает эту строку, и q= будет фактически интерпретироваться как "пробел", заметив, что%20 теперь является пробелом.
UTF-16 использует 2 байта и представлен как таковой.
http://www.google.com?q=space%0020character
этот пример фактически потерпит неудачу, так как URI фактически должен использовать UTF-8, но этот пример демонстрирует это.
Символ Unicode будет иметь значение 0020 или два байта со значениями 0 и 32 соответственно.
Мандарин - это какой-то тип символов Юникода, а UTF-16 будет кодировать Юникод, чтобы его можно было представить в Ascii.
Вот статья в вики, объясняющая немного больше в глубине