Яка різниця між кодуванням та кодом?


151

Мене плутає кодування тексту та діаграма. З багатьох причин мені доводиться вивчати матеріали, що не належать до Unicode, не UTF8, у своїй майбутній роботі.

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

Яка різниця між кодуванням тексту та діаграмою? Буду вдячний, якщо ви могли б показати мені кілька прикладів використання.


Дивіться цей пост: stackoverflow.com/questions/13743250 / ...
rghome

Відповіді:


144

В основному:

  1. charset - це набір символів, який ви можете використовувати
  2. кодування - це спосіб збереження цих символів у пам'яті

42
Щоправда, але в реальному використанні "charset" зазвичай посилається як на репертуар символів, так і на схему кодування.
Алан Мур

@AlanMoore Дійсно, майже так само, як люди кажуть "десятковий номер", щоб посилатися на будь-яке число з "десятковим роздільником". Це не дуже правильно, але так, ви повинні знати, що деякі люди використовують це так.
bvdb

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

84

Кожне кодування має з цим пов'язаний певний набір шаблонів, але може бути більше одного кодування для даної таблиці. Шарсет - це просто те, що звучить, набір символів. Існує велика кількість діаграм, в тому числі багато, які призначені для певних сценаріїв або мов.

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


20
Зауважте, що javadoc помилково використовує "charset" замість "кодування", наприклад, в InputStreamReader , ми читаємо "InputStreamReader - це міст з потоків байтів до потоків символів: він читає байти та розшифровує їх у символи за допомогою заданої діаграми. його використання може бути вказане ім'ям або може бути надано явно, або ж може бути прийнято схему за замовчуванням платформи ". . Однак те, що вони означають, - "кодування".
Девід Тонхофер

4
Дякуємо за ваше пояснення. Unicode - це набір символів, а UTF-8 - один із способів кодування Unicode , а UTF-16 - інший спосіб кодування Unicode .
HongchaoZhang

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. Як кодові одиниці кодуються в байти (наприклад, big-endian або little-endian)

Крок №1 сам по собі є "репертуаром символів" або абстрактним "набором символів", а # 1 + # 2 = "кодованим набором символів".

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


Чи будемо ми можемо читати charset = 'utf-8' у html-тезі META? тому що це було давно визначено
Ельдоса

26

Кидаючи більше світла для людей, які відвідують відтепер, сподіваємось, це буде корисно.


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

У кожній мові є символи, а колекція цих символів утворює "набір символів" цієї мови. Коли символ кодується, йому присвоюється унікальний ідентифікатор або число, яке називається кодовою точкою. У комп'ютері ці кодові точки будуть представлені одним або кількома байтами.

Приклади набору символів: ASCII (охоплює всі англійські символи), ISO / IEC 646, Unicode (охоплює символи з усіх живих мов світу)

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

Кодований набір символів - це набір, в якому кожному символу присвоюється унікальне число. Це унікальне число називається "кодовою точкою".
Кодовані набори символів іноді називають кодовими сторінками.

Кодування

Кодування - це механізм для зіставлення точок коду з деякими байтами, щоб персонаж можна було читати і записувати рівномірно в різних системах, використовуючи одну і ту ж схему кодування.

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

Розробка вище 3 концепцій

  • Враховуйте це - символ "क" у наборі символів Devanagari має десятковий кодовий момент 2325, який буде представлений двома байтами ( 09 15) при використанні кодування UTF-16
  • У схемі кодування "ISO-8859-1" "ü" (це не що інше, як символ у наборі символів латинською мовою) представлено у вигляді шістнадцяткових значень, у FCтой час як в "UTF-8" воно позначається як C3 BCі в UTF-16 як FE FF 00 FC.
  • Різні схеми кодування можуть використовувати одну і ту саму кодову точку для представлення різних символів, наприклад, у "ISO-8859-1" (також називається латинським1) значення десяткового кодового коду для літери "é" становить 233. Однак у ISO 8859-5 , той самий код коду позначає кириличний символ 'щ'.
  • З іншого боку, одна точка коду в наборі символів Unicode може бути фактично відображена в різні послідовності байтів, залежно від того, яке кодування було використано для документа. Символ Devananagari з кодовою точкою 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. Unicode проходить через ряд абстракцій. абстрактні символи -> кодові точки -> кодування кодових точок до байтів.

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

Коротше кажучи, кодування: кодові точки -> байт-схема: символи -> байти


5

Шарсет - це просто набір; він або містить, наприклад, знак Євро, або ж він - ні. Це все.

Кодування - це бієктивне відображення з набору символів до набору цілих чисел. Якщо він підтримує знак Євро, він повинен призначити певне ціле число цьому символу, а не іншому.


Чи повинно бути біективним?
Йорг W Міттаг

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

1
Спадкові кодування символів часто не є біективними. Наприклад, в IBM437 і β, і β представлені 0xE1.
dan04

3

На мій погляд, кодування є частиною кодування (компонента), кодування має атрибут charset, тому шаблони можуть використовуватися у багатьох кодуваннях. Наприклад, unicode - це набір шаблонів, що використовується в кодуваннях, таких як 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.