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

#c# #.net #vb.net #text #encoding

#c# #.net #vb.net #текст #кодирование

Вопрос:

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

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

 Dim myStr as String = "Hello"
  

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

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

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

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

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

Комментарии:

1. хороший вопрос… По моему опыту, многие разработчики сталкиваются с этим.

Ответ №1:

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

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

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

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

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

Комментарии:

1. Спасибо за эту ссылку (и остальную часть вашего ответа)

2. потрясающая статья!! («Абсолютный минимум …») Я думал, что хорошо понимаю и все же кое-чему научился. Прочитайте это!!!

Ответ №2:

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

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

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

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

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

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

Ответ №3:

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

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

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

Ascii может быть представлен в Unicode. однако Unicode не может быть представлен в ascii без кодирования.

Кодировка UTF использует специальный символ ‘%’, чтобы сообщить вам, что следующее является шестнадцатеричным значением закодированного символа.

Например, — это символ 32, который на самом деле является пробелом.

 http://www.google.com?q=space character
  

при размещении этого URL-адреса в браузере UTF-8 декодировал бы эту строку, и q = фактически интерпретировался бы как «символ пробела», обратите внимание, что теперь является пробелом.

UTF-16 использует 2 байта и представляется как таковой.

 http://www.google.com?q=space20character
  

этот пример на самом деле потерпел бы неудачу, поскольку URI на самом деле должен использовать UTF-8, но этот пример демонстрирует суть.

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

Mandarin — это некоторый тип символов Юникода, а UTF-16 будет кодировать Юникод, чтобы его можно было представить в Ascii.

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

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