В чем разница между кодировкой и кодировкой? - PullRequest
134 голосов
/ 17 февраля 2010

Я запутался в кодировке текста и кодировке. По многим причинам я должен изучите не-Unicode, не-UTF8 материал в моей предстоящей работе.

Я нахожу слово "charset" в заголовках писем, как в "ISO-2022-JP", но нет такая кодировка в текстовых редакторах. (Я осмотрел разные текстовые редакторы.)

В чем разница между кодировкой текста и кодировкой? я бы оценил это если бы вы могли показать мне несколько примеров использования.

Ответы [ 11 ]

123 голосов
/ 17 февраля 2010

В основном:

  1. кодировка - это набор символов, который вы можете использовать
  2. Кодировка - это способ хранения этих символов в памяти.
78 голосов
/ 17 февраля 2010

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

Тем не менее, мы находимся на пути перехода к Unicode, который включает в себя набор символов, способный представлять практически все сценарии мира. Однако для Unicode существует несколько кодировок. Кодировка - это способ отображения строки символов в строку байтов. Примеры кодировок Unicode включают UTF-8 , UTF-16 BE и UTF-16 LE . Каждый из них имеет свои преимущества для конкретных приложений или архитектур машин.

44 голосов
/ 17 февраля 2010

В дополнение к другим ответам, я думаю, что эта статья хорошо читается http://www.joelonsoftware.com/articles/Unicode.html

Статья озаглавлена ​​" Абсолютный минимум, который должен знать каждый разработчик программного обеспечения. Абсолютно, положительно должен знать о юникоде и наборах символов (без извинений!) ". Эссе уже более 10 лет, но (к сожалению) содержание все еще в силе ...

26 голосов
/ 23 июня 2010

Кодировка символов состоит из:

  1. Набор поддерживаемых символов
  2. Отображение между символами и целыми числами («кодовые точки»)
  3. Как кодовые точки кодируются в виде серии «кодовых единиц» (например, 16-битных единиц для UTF-16)
  4. Как кодовые единицы кодируются в байты (например, с прямым или обратным порядком байтов)

Шаг # 1 сам по себе является "набором символов" или абстрактным "набором символов", а # 1 + # 2 = "набором кодированных символов".

Но еще до того, как Unicode стал популярным, и все (кроме восточноазиатских) использовали однобайтовое кодирование, шаги # 3 и # 4 были тривиальными (кодовая точка = кодовая единица = байт). Таким образом, в старых протоколах не было четкого различия между «кодировкой символов» и «набором кодированных символов». Старые протоколы используют charset, когда они действительно означают кодирование.

19 голосов
/ 09 октября 2015

Пролить больше света для людей, посещающих отныне, надеюсь, это будет полезно.


Набор символов

Есть символы на каждом языке, и коллекция этих символов образует «набор символов» этого языка. Когда символ закодирован, ему присваивается уникальный идентификатор или номер, называемый кодовой точкой. В компьютере эти кодовые точки будут представлены одним или несколькими байтами.

Примеры набора символов: ASCII (охватывает все английские символы), ISO / IEC 646, Unicode (охватывает символы всех живых языков мира)

Набор кодированных символов

Набор кодированных символов - это набор, в котором каждому персонажу присваивается уникальный номер. Этот уникальный номер называется «кодовая точка».
Наборы кодированных символов иногда называют кодовыми страницами.

Кодирование

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

Примеры кодирования: ASCII, схемы кодирования Unicode, такие как UTF-8, UTF-16, UTF-32.

Разработка вышеуказанных 3 концепций

  • Учтите это - символ 'क' в Деванагари набор символов имеет десятичную кодовую точку из 2325, которая будет представлена ​​двумя байтами (09 15) при использовании Кодировка UTF-16
  • В схеме кодирования «ISO-8859-1» «ü» (это не что иное, как символ в наборе символов латинского алфавита) представляется как шестнадцатеричное значение FC, тогда как в «UTF-8» оно представляется как C3 BC и в UTF-16 как FE FF 00 FC.
  • Различные схемы кодирования могут использовать одну и ту же кодовую точку для представления разных символов, например, в «ISO-8859-1» (также называемом Latin1) значение десятичной кодовой точки для буквы «é» равно 233. Однако в ISO 8859-5, та же самая кодовая точка представляет кириллицу 'щ'.
  • С другой стороны, одна кодовая точка в наборе символов Unicode может фактически отображаться в разные последовательности байтов в зависимости от того, какая кодировка использовалась для документа. Символ Деванагари क с кодовой точкой 2325 (которая равна 915 в шестнадцатеричном формате) будет представлен двумя байтами при использовании кодировки UTF-16 (09 15), тремя байтами с UTF-8 (E0 A4 95) или четыре байта с UTF-32 (00 00 09 15)
10 голосов
/ 17 февраля 2010

Набор символов или набор символов - это просто набор (неупорядоченная коллекция) символов. Набор кодированных символов присваивает целое число («кодовую точку») каждому символу в репертуаре. Кодирование - это способ однозначного представления кодовых точек в виде потока байтов.

6 голосов
/ 17 февраля 2010

Погуглил за это. http://en.wikipedia.org/wiki/Character_encoding

Разница кажется незначительной. Термин charset на самом деле не относится к Unicode. Юникод проходит через серию абстракций. абстрактные символы -> кодовые точки -> кодирование кодовых точек в байты.

Charsets фактически пропускают это и непосредственно переходят от символов к байтам. последовательность байтов <-> последовательность символов

Короче говоря, кодировка: кодовые точки -> байты кодировка: символы -> байты

5 голосов
/ 17 февраля 2010

кодировка - это просто набор; он либо содержит, например, знак евро, иначе это не так. Вот и все.

Кодировка - это биективное отображение набора символов в набор целых чисел. Если он поддерживает знак евро, он должен присвоить определенное целое число этому символу и никаким другим.

1 голос
/ 27 июня 2019

По моему мнению, кодировка является частью кодировки (компонента), кодировка имеет атрибут charset, поэтому кодировка может использоваться во многих кодировках. Например, юникод - это кодировка, используемая в таких кодировках, как UTF-8, UTF-16 и так далее. Смотрите иллюстрацию здесь: See illustration here

Char в charset не означает тип char в мире программирования, это означает, что символ в реальном мире, на английском это может быть то же самое, но на других языках нет, как на китайском, «我» - это неразделимый символ «char» в кодировках (UNICODE, GB [используется в GBK и GB2312]), 'a' также является символом в кодировках (ASCII, ISO-8859 , UNICODE).

1 голос
/ 24 апреля 2018

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

Думайте о байтах как числах от 0 до 255, тогда как символы - это абстрактные вещи, такие как «a», «1», «$» и «Ä». Набор всех доступных символов называется набор символов .

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

Большинство кодировок основаны на старом наборе символов и кодировке, называемой ASCII, которая представляет собой один байт на символ (на самом деле, только 7 бит) и содержит 128 символов, включая множество общих символов, используемых в американском английском.

Например, здесь есть 6 символов в наборе символов ASCII, которые представлены значениями от 60 до 65.

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

В полном наборе ASCII самое низкое используемое значение равно нулю, а самое высокое - 127 (оба они являются скрытыми управляющими символами).

Однако, как только вы начинаете нуждаться в большем количестве символов, чем обеспечивает базовый ASCII (например, буквы с акцентами, символы валюты, графические символы и т. Д.), ASCII не подходит, и вам нужно что-то более обширное. Вам нужно больше символов (другой набор символов) и другая кодировка, поскольку 128 символов недостаточно для размещения всех символов. Некоторые кодировки предлагают один байт (256 символов) или до шести байтов.

Со временем было создано много кодировок. В мире Windows есть CP1252 или ISO-8859-1, тогда как пользователи Linux предпочитают UTF-8. Java использует UTF-16 изначально.

Одна последовательность значений байтов для символа в одной кодировке может обозначать совершенно другой символ в другой кодировке или даже может быть недействительной.

Например, в ISO 8859-1 , â представлен одним байтом значения 226, тогда как в UTF-8 это два байт: 195, 162. Однако в ISO 8859-1 , 195, 162 будет два символа, Ã,, .

Когда компьютеры хранят данные о символах внутри или передают их в другую систему, они сохраняют или отправляют байты. Представьте, что система, открывающая файл или получающая сообщение, видит байты 195, 162. Откуда он знает, что это за символы?

Чтобы система могла интерпретировать эти байты как действительные символы (и, следовательно, отображать их или преобразовывать их в другую кодировку), ей необходимо знать используемую кодировку. Вот почему кодировка отображается в заголовках XML или может быть указана в текстовом редакторе. Он сообщает системе отображение между байтами и символами.

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