#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.
Вот статья вики, объясняющая немного более подробно