В чем разница между кодировкой и кодировкой?


151

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

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

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


Смотрите это сообщение: stackoverflow.com/questions/13743250/…
rghome

Ответы:


144

В принципе:

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

42
Правда, но при фактическом использовании «кодировка» обычно относится как к репертуару символов, так и к схеме кодирования.
Алан Мур

@AlanMoore Действительно, почти так же, как люди говорят «десятичное число» для обозначения любого числа с «десятичным разделителем». Это не совсем правильно, но да, вы должны знать, что некоторые люди используют это таким образом.
17

2
Это не совсем верно. Например, Unicode относится к набору символов, но существует несколько возможных кодировок (UTF-8, UTF-16, UTF-32).
августа

84

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

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


20
Обратите внимание, что javadoc ошибочно использует «charset» вместо «encoding», например, в InputStreamReader мы читаем «InputStreamReader - это мост от байтовых потоков к символьным потокам: он читает байты и декодирует их в символы, используя указанную кодировку. его использование может быть указано по имени или может быть задано явно, или может быть принят кодовый набор по умолчанию платформы ". , Тем не менее, они имеют в виду «кодирование».
Дэвид Тонхофер

4
Спасибо за ваше объяснение. Unicode - это набор символов, и UTF-8 - это один из способов кодирования Unicode , а UTF-16 - это другой способ кодирования Unicode .
Хунчао Чжан

47

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

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


2
Большое спасибо за представление статьи. Это является хорошим.
ТЗ.

9
Этот ответ может быть улучшен, если дать краткое объяснение того, почему я должен читать статью Джоэла.
james.garriss

@mattanja Ссылка, которую вы предоставили, очень хорошая. Спасибо, что поделился. Проголосовал.
hagrawal

1
Я также хочу поместить эту замечательную статью, которая является своего рода приложением к статье Джоэла Спольски; kunststube.net/encoding
MKB

Я не понял статью Джоэла при первом прочтении. Скорее я нашел этот PowerPoint гораздо яснее и конкретны: unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer

27

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

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

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

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


почему мы можем прочитать charset = 'utf-8' в html-теге META? потому что это было определено давно
Eildosa

26

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


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

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

Примеры набора символов : 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)

11

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


Это должен быть принятый ответ. Он четко определяет три понятия: набор символов, набор кодированных символов и кодирование.
Маркус Юний Брут

6

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

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

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

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


5

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

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


Это должно быть биективно?
Йорг Миттаг

2
Ну, кодирование и декодирование должны быть детерминированными, поэтому не может быть никаких неоднозначных отображений. Я полагаю, что вы можете иметь несмежный набор целых чисел в качестве кодомена, но это будет тратить пространство, когда вы сохраняете текст, а инженеры ненавидят потраченное впустую пространство.
Килиан Фот

1
Унаследованные кодировки часто не являются биективными. Например, в IBM437 и ß, и β представлены 0xE1.
Ден04

3

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

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


1

По моему мнению, слово «charset» должно быть ограничено идентификацией параметра, используемого в HTTP, MIME и аналогичных стандартах для указания кодировки символов (сопоставления из серии текстовых символов в последовательность байтов) по имени. Например: charset=utf-8.

Однако я знаю, что MySQL, Java и другие места могут использовать слово «charset» для обозначения кодировки символов.


1

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

Думайте о байтах как числах от 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 или может быть указана в текстовом редакторе. Он сообщает системе отображение между байтами и символами.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.