Подтвердить что ты не робот

Понимание кодирования текста (в .Net)

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

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

Dim myStr as String = "Hello"

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

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

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

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

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

4b9b3361

Ответ 1

Строка .NET string - это строки кодирования с использованием UTF16 - это означает, что 2 байта на символ (хотя он позволяет использовать специальные комбинации из двух символов для образуют один 4-байтовый символ, так называемые "суррогатные пары" ).

UTF8 с другой стороны будет использовать переменное количество байтов, необходимое для представления конкретного символа Юникода, то есть только один байт для обычных символов ASCII, но, возможно, 3 байта для китайского персонажа. Оба кодировки позволяют отображать все символы Юникода, поэтому между ними всегда есть сопоставление - оба являются бинарными представлениями (например, для хранения в памяти или на диске) одного и того же (юникодного) набора символов.

Поскольку не все символы Юникода были в состоянии вписаться в исходные 2 байта, зарезервированные UTF-16, формат также позволяет обозначать комбинацию из двух символов UTF-16 для формирования 4 байтовых символов - так сформированный символ называется "суррогатная" или суррогатная пара и представляет собой пару 16-разрядных значений кодировки Unicode, которые вместе представляют один символ.

UTF-8 не имеет этой проблемы, так как количество байтов на символ Unicode не фиксировано. Хороший общий обзор UTF-8, UTF-16 и спецификаций можно собрать здесь.

Отличный обзор/введение в кодировку символов Unicode Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о юникодном и символьном наборах

Ответ 2

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

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

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

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

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

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

Ответ 3

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, но этот пример демонстрирует точку.

Символ Юникода будет 0020 или два байта со значениями 0 и 32 соответственно.

Мандарин будет одним типом символов Юникода, а UTF-16 будет кодировать Юникод, поэтому он будет представлен в Ascii.

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

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