Понимание кодировки текста (In .Net) - PullRequest
18 голосов
/ 03 мая 2011

Я очень мало сделал с кодировкой текста. По правде говоря, я даже не знаю, что именно это означает.

Например, если у меня есть что-то вроде:

Dim myStr as String = "Hello"

Это «закодировано» в памяти в определенном формате? Этот формат зависит от того, какой язык я использую?

Если бы я был в другой стране, например, в Китае, и у меня была строка на китайском (мандарин? Мои извинения, если я здесь использую неправильные слова), был бы следующий код (который я использовал на Английские строки) все так же работают?

System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
return encoding.GetBytes(str);

Или он потеряет всякий смысл, если вы преобразуете эту строку .Net в кодировку UTF8, если это преобразование недопустимо?

Наконец, я работал с .Net уже несколько лет, и я никогда не видел, не слышал и не должен был что-либо делать с Кодировкой. Я исключение или это не обычное дело?

Ответы [ 3 ]

27 голосов
/ 03 мая 2011

Строковый класс .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: Абсолютный минимум для каждого разработчика программного обеспеченияАбсолютно, положительно должен знать о Unicode и наборах символов

9 голосов
/ 03 мая 2011

Прежде всего: не отчаивайтесь, вы не одиноки. Осведомленность в отношении кодировки символов и представления текста в целом - это, к сожалению, редкость, но сейчас нет лучшего времени, чтобы начать обучение, чем прямо сейчас!

В современных системах, включая .NET, текстовые строки представлены в памяти некоторой кодировкой Unicode кодовые точки . Это просто цифры. Кодовая точка для символа A равна 65. Кодовая точка для авторского права (c) - 169. Кодовая точка для тайской цифры шесть: 3670.

Термин «кодировка» относится к тому, как эти числа представлены в памяти. Существует ряд стандартных кодировок, которые используются для того, чтобы текстовое представление могло оставаться согласованным при передаче данных из одной системы в другую.

Простым стандартом кодирования является UCS-2, согласно которому кодовая точка сохраняется в необработанном виде в виде 16-разрядного слова. Это ограничено из-за того, что оно может представлять только кодовые точки 0000-FFFF, и такой диапазон не охватывает всю ширину кодовых точек Unicode.

UTF-16 - это внутренняя кодировка класса .NET String. Большинство символов вписываются в одно 16-битное слово, но значения больше FFFF кодируются с помощью суррогатных пар (см. Вики). Из-за этой схемы кодирования UTF-16 не может кодировать кодовые точки D800-DFFF.

UTF-8 , пожалуй, самая популярная кодировка, используемая сегодня, по ряду причин, описанных в статье Wiki.

1 голос
/ 03 мая 2011

UTF - это определенный тип кодирования с несколькими различными размерами. Каждый тип кодировки определяет, сколько памяти и какое представление в этой памяти занимают символы.

Обычно мы работаем с Unicode и Ascii.

Юникод равен 2 байта на символ.
Ascii равен 1 байту на символ.

Ascii можно представить в юникоде. однако 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...