Чому "загальна карта" насправді означає "кодування" в загальному використанні?


10

Щось давно мене бентежить, це те, що стільки програмного забезпечення використовують терміни «charset» та «кодування» як синоніми.

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

Оскільки ці набори правил іноді надають лише можливість "кодувати" деякий підмножина всіх символів Unicode, ви можете уявити, що "набір символів" - короткий для "набору символів" - означатиме просто набір символів Unicode - без будь-якого врахування того, як ці символи закодовані. Таким чином, кодування означатиме схему (кодування типу ASCII, у якого є лише правила для кодування 128 символів, буде асоційовано із набором цих 128 символів), але для кодування не повинно бути кодування (наприклад, UTF-8, UTF -16 і UTF-32 - всі різні кодування, але можуть кодувати один і той же набір символів).

Однак - і ось суть мого питання - використання слова "charset" у реальному світі не відповідає тому, що означала б конструкція слова. Він майже завжди використовується для позначення "кодування".

Наприклад:

  • charsetАтрибут в HTML використовується для вказівки кодування
  • Charsets на Java - це кодування
  • charsets і character setsв MySQL, знову ж таки, кодування

Скільки років цього цікавого (не) використання мови, і як з'явилося це контрінтуїтивне визначення поняття "charset"? Є чи можливо , походить від часу , коли дійсно був , на практиці, відображення взаємно-однозначне відповідність між кодуваннями в використанні і наборами символів вони підтримуються? Або був якийсь особливо впливовий стандарт чи специфікація, яка диктувала це визначення цього слова?


5
Використання було charsetраніше, ніж стандарт Unicode, тому, хоча це не могло бути "зіставленням один на один", символи, необхідні для документа, як правило, змушували вибір кодування. Але я не
встигаю

2
Ви говорите про набори символів як про "набір символів Unicode", як ніби хтось починав з Unicode, а потім вибирав підмножини. Більш точно сказати, що багато наборів символів існували до винаходу Unicode (або, принаймні, до того, як Unicode стане повсюдним), і Unicode навмисно побудований для їх надмножини.
Іван Варфоломій

Відповіді:


3

Поняття наборів символів старше Unicode.

Перед Unicode набір символів визначав набір символів і те, як кожен символ був представлений як біти. Більшість наборів символів відображає персонаж у байт (що дозволяє набір 256 символів), деякі зіставляються у два байти, а деякі (як ASCII) лише до 7 біт. Різні набори символів часто привласнюють одному знаку різні значення, і між різними наборами символів не використовується універсальний ключ перекладу.

Unicode була спробою вирішити цю проблему, об'єднавши всі різні набори символів у загальний "суперсет". Для цього Unicode запровадив деякі додаткові рівні абстракції, наприклад, концепцію кодування символів як щось, що є окремим від значень кодової точки. Це дозволило Unicode перевизначити набори символів попереднього коду як кодування символів unicode.

Атрибут charset в HTML (який відображає параметр charset у заголовку типу вмісту HTTP), наприклад, раніше, ніж unicode був широко прийнятий, але коли було прийнято рішення прийняти unicode як універсальний набір символів в Інтернеті, атрибут charset було просто переосмислено, щоб вказати кодування, яке використовується, але ім'я не було змінено на те, що дозволяє підтримувати зворотну сумісність.


9

Термін "charset", звичайно, є коротким для "набір символів", що, в свою чергу, є старим терміном, який використовується для кодування символів, який можна інтерпретувати як: а) відображення між послідовностями байтів і символів; b) відображення між цілими числами (кодові числа) та символи або c) відображення між абстрактними символами або цілими чи послідовностями байтів.

"Набір символів" був використаний, оскільки це короткий і простий вираз. У ньому "набір" має розпливчасте значення (оскільки все поняття розпливчасте), але пізніше його часто неправильно трактують як колекцію ("набір" у теоретичному сенсі множини), як описано у (колись) відомому наборі персонажів Дена Коннеллі Вважається шкідливим .

Найважливіше тоді було те, що ідентифікатор charsetбув використаний у MIME та HTTP. Псевдонім HTTP 1.0 RFC 1945 цитує визначення MIME, "метод, що використовується з однією або кількома таблицями для перетворення послідовності октетів у послідовність символів", а потім коментує плутанину: "Це використання терміна" набір символів "більше зазвичай називають "кодуванням символів". Однак, оскільки HTTP та MIME мають один і той же реєстр, важливо, щоб термінологія була спільною. "


1

RFC2045 ввів "MIME" набір символів, і до того часу вже було зрозуміло, що не всі кодування відображали один знак на один октет. RFC2130 трохи більше обговорює цю історію.

В основному, "charset" був більш популярним терміном, коли ці стандарти були написані, він більш лаконічний, ніж "кодування символів" або "схема кодування тексту", і менш неоднозначний, ніж "кодування".


Мені здається, параметр «charset» вже присутній у RFC 1341 (червень 1992 р.).
Іван Варфоломій

1

Існує щонайменше 2 кодування, застосовні для передачі тексту. Кодування символів описує, як кодуються символи (гліфи). Усі мови використовують підмножину набору символів UCS, які часто кодуються до значення 8 біт. Стандартизовані набори символів мають стандартні кодування символів, а терміни, як правило, використовуються взаємозамінно.

Кодування передачі описує, як передається текст і як правило не залежить від кодування символів. Більшість кодувань передачі непрозорі і змінюють послідовність передавання байтів. 8-бітове кодування передачі прозоре для 8-бітових кодувань. 7-бітове кодування передачі може передавати лише 7-бітові набори символів, такі як ASCII

ASCII використовує 95 символів для друку та ще декілька символів для управління перевезеннями (стрічка ліній, канал форми, повернення каретки, повернення назад та вкладки), закодовані у 7 біт. Існують додаткові контрольні символи, що використовують інші значення. ASCII - це належна підмножина наборів символів UCS, а також багатьох 8-бітових наборів символів. ISO-8859-1 також є належним підмножиною набору символів UCS, але ці символи мають різні кодування в UTF-8, у яких використовуються кілька байтів для знакових знаків більше 127.

Мейнфрейми IBM використовують (d) EBCDID, який використовував інше 8-бітове кодування. Існують таблиці перекладу, які відображають символи для друку між кодуванням символів ASCII та ECBDIC. ECBDIC має більший набір символів, ніж ASCII, оскільки він має розділові знаки, недоступні в ASCII. Це може запобігти повному перетворенню між цими кодуванням, якщо початкове кодування є ECBDIC.

Цього кодування було недостатньо для мов із символами, які не охоплені символами для друку ASCII. Microsoft та інші використовували 8-бітні розширення до набору символів ASCII та кодували додаткові символи зі значеннями вище 127. Одного розширення було недостатньо для всіх мов, оскільки ці розширення додали до набору символів до 96 символів. Це призвело до використання декількох наборів символів (діаграм) для різних мов з різним 8-бітовим кодуванням символів. Ці набори символів включають символи, необхідні для цієї мови чи мовної родини. Додаткові символи можуть бути закодовані до різних значень у різних діаграм. Англійські користувачі, швидше за все, помічають це за допомогою розширених розділових знаків (лівий і правий лапки та тире), які відображаються неправильно, якщо використовується неправильний набір символів.

Для однобайтових кодувань можуть бути закодовані лише символи в наборі символів. Для деяких мов потрібні багатобайтові кодування для покриття їх набору символів. Набір символів Unicode (UCS) вимагає багатобайтових кодувань для символів поза набором символів ASCII. Цей набір символів є сукупністю всіх кодувань, що відповідають мові. UTF-8 - це компактне кодування набору символів UCS. ASCII не потребує додаткових байтів, і більшість (усіх?) Символів європейської мови можуть бути закодовані у вигляді одного або двох байтів. Повний набір символів UCS-2 може бути закодований в один-три байти. Усі символи поточного набору символів UCS можуть бути закодовані в один-чотири байти.


0

FWIW, IIRC, назад в Commodore 64 дні, набір символів був функцією від {0, ... 255} до набору всіх чорно-білих зображень uxv, де u і v було, можливо, 8 і 12. Отже, "змінивши набір символів "означало використання команди POKE мовою BASIC для зміни місць розташування пам'яті, призначених для зберігання цих зображень. Наприклад, код 65 ASCII означав A, а зображення A буде зберігатися, починаючи з адреси пам'яті a * 65 + b протягом деякого b, і я думаю, що a = u * v.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.