Понимание кодировки текста (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.

Вот статья в вики, объясняющая немного больше в глубине

http://en.wikipedia.org/wiki/UTF-8

Другие вопросы по тегам