Чи зможе UTF-8 підтримати включення широкої чужої мови з мільйонами нових символів?


86

У випадку, якщо вторгнення прибульців відбулося, і ми змушені були підтримувати їхні мови у всіх наших існуючих комп'ютерних системах, чи UTF-8 розроблений таким чином, щоб забезпечити їх можливо велику кількість символів?

(Звичайно, ми не знаємо, чи справді інопланетяни володіють мовами, чи або як вони спілкуються, але заради аргументації, будь ласка, уявіть, що вони роблять.)

Наприклад, якби їх мова складалася з мільйонів новоспечених гліфів, символів та / або поєднання символів , чи можна теоретично розширити UTF-8 безперебійним чином, щоб включити ці нові гліфи і все-таки підтримувати все існуюче програмне забезпечення?

Мене більше цікавить, чи глифи значно перевищують поточні обмеження розміру і потрібно більше байтів, щоб представити один гліф. У випадку, якщо UTF-8 не вдасться розширити, чи це доводить, що єдиною перевагою перед UTF-32 є просто розмір нижчих символів?


16
"підтримують свої мови " (мій наголос) ... Скільки? Ми впевнені, що мови можна розділити на символи? Можливо, мова заснована на просторових відносинах. - див. Тед Чіанг "Історія свого життя", " Історії твого життя" та інші . У кращому випадку це просто питання max-things-in-X-bytes (поза темою). У гіршому випадку це спекулятивна нісенітниця. (не зрозуміло, що ви просите)
Мізерний Роджер

6
@ScantRoger Прийнята відповідь чудово справляється з відповіддю на питання, як було призначено.
Qix

11
Отримана відповідь чудово допомагає нам розповісти факти UTF-8, UTF-16 та UTF-32. Ви можете просто подивитися це у Вікіпедії. Що стосується "чужорідного вторгнення", я не бачу, як відповідь взагалі на нього звертається.
Мізерний Роджер

10
Пов'язане (на переповнення стека): Чи достатньо UTF-8 для всіх поширених мов?
янніс

9
Unicode не підтримує мови, він підтримує символи - гліфи, які використовуються для представлення значення в письмовій формі. Багато людських мов не мають сценарію, а тому Unicode не може підтримуватися. Не кажучи вже про те, що багато тварин спілкуються, але не мають письмової мови. Спілкування ілюстраціями сказати чи безслівними коміксами не може підтримуватися unicode, оскільки набір гліфів не є кінцевим. За визначенням ми не знаємо, як спілкуються прибульці, тому на ваше питання неможливо відповісти. Якщо ви просто хочете дізнатися, скільки різних символів може підтримувати унікод, вам, мабуть, слід уточнити :)
JacquesB

Відповіді:


109

Стандарт Unicode має багато місця для запасу. Кодові точки Unicode організовані в "площини" та "блоки". З 17 загальних літаків 11 наразі не призначені . Кожен літак містить 65 536 символів, тому реально є півмільйона кодових точок, щоб запастися на чужу мову (якщо тільки ми не заповнимо все це більше емоджи перед першим контактом). Станом на Unicode 8.0, всього було присвоєно 120 737 кодових пунктів (приблизно 10% від загальної ємності), приблизно приблизно така ж сума не призначена, але зарезервована для приватного використання. Загалом 974,530 точок коду не призначено.

UTF-8 є специфічним кодуванням Unicode і в даний час обмежений чотирма октетами (байтами) на кодову точку, що відповідає обмеженням UTF-16. Зокрема, UTF-16 підтримує лише 17 літаків. Раніше UTF-8 підтримував 6 октетів на кодову точку і був розроблений для підтримки 32768 літаків. В принципі, цей 4-байтний ліміт може бути скасований, але це порушить поточну організаційну структуру Unicode і вимагатиме поступового припинення UTF-16 - навряд чи це станеться найближчим часом, враховуючи, наскільки закріплений він у певних операційних системах та програмуванні мови.

Єдина причина, що UTF-16 все ще використовується в тому, що це розширення до хибного кодування UCS-2, яке підтримує лише одну площину Unicode. В іншому випадку він успадковує небажані властивості як від UTF-8 (не з фіксованою шириною), так і від UTF-32 (не сумісний з ASCII, втрата місця для загальних даних), і вимагає байтових знаків порядку, щоб оголосити про небезпеку. Зважаючи на те, що незважаючи на ці проблеми, UTF-16 все ще популярний, я не надто оптимістичний, що це зміниться саме по собі. Сподіваємось, наші нові Чужоземні володарі побачать цю перешкоду для свого правління, і в їхній мудрості виганяють UTF-16 з лиця землі .


7
Власне, UTF-8 обмежений лише частиною навіть 4-байтного обмеження, щоб відповідати UTF-16. Зокрема, до 17/32, трохи більше половини.
Дедуплікатор

5
За межами Windows я не знаю жодної іншої ОС, де або ОС, або більшість програм на ОС використовують UTF16. Програми OSX, як правило, UTF8, програми Android, як правило, UTF8, Linux, як правило, UTF8. Отже, все, що нам потрібно - це померти Windows (вона вже є
якось

23
Якщо ми не заповнимо все це більше емоджи перед першим контактом ... Там у вас це є. Найбільш істотною загрозою мирній взаємодії з прибульцями є емоджи. Ми приречені.
рикстер

13
@slebetman Не дуже. Все, що базується на JVM, використовує UTF-16 (а також Android, не впевнений, чому ви сказали, що це не так), JavaScript використовує UTF-16, а якщо Java та JavaScript є найпопулярнішими мовами, UTF-16 нікуди не збирається скоро.
Малькольм

5
@Kaiserludi "Більшість кодів Linux використовує UTF32 для unicode", так, ні. Серйозно, звідки ти, до біса, ця ідея? Немає навіть wfopen систематичного виклику чи чогось іншого, це UTF8 на всьому шляху. Пекло навіть Python та Java - обидва, які визначають рядки як UTF-16 через історичні причини - не зберігають рядки як UTF-16, за винятком випадків, коли це необхідно .. великі переваги пам’яті та відсутність результативних дій (і це незважаючи на додатковий код для обробки конверсій - пам'ять дорога, процесор дешевий). Те ж саме стосується Android - JString NDK - це UTF8, в основному тому, що інженери Google не божевільні.
Voo

30

Якщо насправді UTF-8 буде розширено, ми повинні подивитися на абсолютний максимум, який він може представляти. UTF-8 структурований так:

Char. number range  |        UTF-8 octet sequence
   (hexadecimal)    |              (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

(Безсоромно скопійована з RFC ) . Ми бачимо , що перший байт завжди контролює , скільки наступних байтів складають поточний символ.

Якщо розширити його до 8 байт, ми отримаємо додаткові уявлення Unicode

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111110 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111111 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Обчислення максимально можливих уявлень, які ця методика дозволяє нам дійти

  10000000₂
+ 00100000₂ * 01000000₂
+ 00010000₂ * 01000000₂^2
+ 00001000₂ * 01000000₂^3
+ 00000100₂ * 01000000₂^4
+ 00000010₂ * 01000000₂^5
+ 00000001₂ * 01000000₂^6
+ 00000001₂ * 01000000₂^7

або в базі 10:

  128
+  32 * 64
+  16 * 64^2
+   8 * 64^3
+   4 * 64^4
+   2 * 64^5
+   1 * 64^6
+   1 * 64^7

що дає нам максимальну кількість представлень як 4,468,982,745,216.

Отже, якщо цих 4 мільярдів ( або трильйона, як вам завгодно ) символів вистачить для представлення чужих мов, я цілком впевнений, що ми можемо з мінімальними зусиллями розширити поточний UTF-8, щоб догодити нашим новим чужим сюзеренам ;-)


8
В даний час UTF-8 обмежений лише кодовими точками до 0x10FFFF - але це лише для сумісності з UTF-16. Якщо виникла потреба у його розширенні, немає сумнівів у тому, як розширити його кодовими точками до 0x7FFFFFFF (це 2³¹-1). Але поза цим я бачив суперечливі визначення. Одне визначення, яке я бачив, має 111111xxяк можливий перший байт, а потім п’ять байтів розширення для максимум 2³² кодових точок. Але це лише сумісне з тим визначенням, яке ви згадуєте для перших 2³¹ кодів.
kasperd

2
Так, Вікіпедія говорить щось про UTF-16, коли вони справді означають Unicode або ISO 10646 (залежно від контексту). Насправді, оскільки RFC 3629, UTF-8 не визначений за межею U + 10FFFF (або F4 8F BF BFу байтах UTF-8). Отже, все, про що я тут згадую, є чистою спекуляцією. Звичайно, хтось може подумати про інші розширення, де високий перший байт означає якусь іншу структуру, що слідує (і, сподіваємось, не руйнує самосинхронізацію в процесі). Я намагався виконати байт-схему, щоб бути максимально наближеним до реального UTF-8, наскільки це можливо.
Boldewyn

4
Це 4 трлн, а не квадрильйон.
Ypnypn

1
Небезпечно, щоб кількість наступних байтів завжди була на одиницю менше, ніж кількість провідних у першому байті. Perl фактично підтримує (з 2000 р.) Внутрішній варіант UTF-8, де форми 5, 6 і 7 байтів збігаються з цією відповіддю, але FFвводять 13-байтовий блок коду, здатний зберігати 72 біта. Все , що понад 2 ^ 36 рівномірно дуже дорого, але він дозволяє кодує 64-бітний Int , а потім деякі.
варення

7

RFC3629 обмежує UTF-8 максимум чотирма байтами на символ, максимальним значенням 0x10FFFF, дозволяючи максимум 1,112,064 кодових очок. Очевидно, це обмеження можна було б зняти, а стандарт продовжити, але це призведе до суттєвої зміни існуючого коду, який працює до цієї межі.

З точки зору файлу даних, це не буде переломною зміною, оскільки стандарт працює на основі того, що якщо встановлено найзначніший біт (MSB) кожного байта, то наступний байт є частиною кодування. Ще до RFC3629 стандарт був обмежений на 31 біт, що залишило MSB четвертого байту невідомим.

Розширення стандарту понад 0x10FFFF призведе до порушення часткової сумісності даних UTF-8 з UTF-16.


5
Отже, теоретично, дані були б сумісні назад, але код не був би по суті сумісний з модифікацією до стандарту?
Qix

2
@Qix, це правильний пункт. Будь-який існуючий файл UTF-8, природно, буде сумісний, наприклад, максимум 6 байт, щоб вмістити мільйони більше кодових точок, але багато існуючих бібліотеки, призначені для обробки UTF-8, швидше за все, не оброблять це розширення.
Девід Арно

4
UTF-16 зірветься смертельно. Він по суті може підтримувати лише кодові точки до 0x10FFFF.
gnasher729

1
@ gnasher729: Не настільки важлива проблема, як ви могли б подумати. Pre-Unicode вирішив це за допомогою значень зрушення (Shift JIS для японців). Вони просто позначать зарезервований / невикористаний символ (0xFFFD?) Як "символ зміщення", що зміщує кодування в більш розширену форму. Ймовірно, UTF32.
Mooing Duck

4

Дійсно, лише 2 кодові пункти Unicode означають нескінченно багато гліфів, якби вони поєднували символи.

Порівняйте, наприклад, два способи, які Unicode кодує для корейського алфавіту Хангул : склади Hangul і Hangul Jamo . Символ 웃 в Hangul Syllabelsє єдиною кодовою точкою, C6C3тоді як в Hangul Jamoньому є три кодові точки 110B(ㅇ) 116E(ㅜ) 11B9(ㅅ). Очевидно, що використання комбінованих символів займає значно менше кодових точок, але є менш ефективним для запису, оскільки для написання кожного символу потрібно більше байтів.

За допомогою цього фокусу немає необхідності виходити за кількість точок коду, які в даний час можуть бути закодовані в UTF-8 або UTF-16.

Я думаю, це зводиться до того, наскільки ображаються прибульці, якби їхня мова вимагала набагато більше байтів за повідомлення, ніж земні мови. Якщо вони не проти, скажімо, представляти кожного зі своїх мільйонів символів, використовуючи комбінацію символів на 100 тис. Символів, тоді проблем немає; з іншого боку, якщо змушені використовувати більше байтів, ніж земляни, змушують їх відчувати себе громадянами другого класу, ми можемо опинитися у конфлікті ( не на відміну від того, що ми вже спостерігаємо з UTF-8 ).


Це лише в тому випадку, якщо символи на чужій мові насправді складаються з більш обмеженого набору графем. Це може бути не так.
ЖакB

1
Наскільки я знаю, немає жодної вимоги, що поєднання символів повинно стосуватися окремих графем. Поширені питання Unicode про це мовчать, але моє враження, що двигун компонування не буде складніше підтримувати розчісування послідовностей, які не є послідовностями графем, оскільки в будь-якому випадку потрібен попередньо складений гліф.
Оуен

Скільки часу живуть ці прибульці і скільки персонажів, не розкладаються на графеми, вони можуть навчитися в дитинстві? І чи зберігає попередньо складений Хангул свою перевагу в байті перед розкладеним Хангулом навіть після gzip?
Damian Yerrick

-2

Редагувати: Питання тепер говорить про "мільйони нових символів". Це дозволяє легко відповісти:

Ні . Utf-8 - це кодування Unicode. У Unicode є кодове простір, який дозволяє 1114,112 різних кодових точок , а менше мільйона наразі не призначено. Тому неможливо підтримати мільйони нових символів в Unicode. За визначенням, кодування Unicode не може підтримувати більше символів, ніж те, що визначено Unicode. (Звичайно, ви можете обдурити, кодуючи рівень далі - будь-який тип даних може бути представлений лише двома символами.)


Щоб відповісти на початкове запитання:

Unicode не підтримує мови як такі, він підтримує символи - символи, які використовуються для представлення мови в письмовій формі.

Не всі людські мови мають письмове представлення, тому не всі людські мови можуть підтримуватися Unicode. Крім того, багато тварин спілкуються, але не володіють письмовою мовою. Наприклад, кити мають форму спілкування, яка є досить складною для виклику мови, але не має жодної письмової форми (і не може бути захоплена існуючими фонетичними позначеннями). Тому Unicode не може підтримувати навіть усі мови на землі.

Ще гірше - це щось на зразок мови бджіл. Він не тільки не має письмової форми, але не може змістовно бути представлений у письмовій формі. Мова - це вид танцю, який в основному вказує в напрямку, але покладається на поточне положення сонця. Тому танець має лише інформаційну цінність у конкретному місці та часі, де він виконується. Символічне або текстове зображення повинно містити інформацію (місце розташування, положення сонця), яку мова бджіл наразі не може виразити.

Навіть письмова або символічна форма спілкування може бути неможливою для представлення в Unicode. Наприклад, ілюстрації або безслівні комікси не можуть підтримуватися Unicode, оскільки набір гліфів не є кінцевим. Ви помітите багато образотворчого спілкування в таких міжнародних умовах, як аеропорт, тому немислимо, що гонка космічних подорожніх еволюціонерів розвинеться з використанням живописної мови.

Навіть якщо інопланетна раса мала мову із системою письма з обмеженим набором символів, цю систему, можливо, неможливо підтримати в Unicode. Unicode очікує, що запис буде лінійною послідовністю символів. Нотація музики - це приклад системи запису, яка не може бути повністю представлена ​​в Unicode, оскільки значення кодується як у виборі символів, так і у вертикальному та горизонтальному розміщенні. (Unicode підтримує окремі музичні символи, але не може кодувати партитуру.) Чужа раса, яка спілкувалася за допомогою поліфонічної музики (не рідкість) або каналу спілкування подібної складності, може дуже мати систему письма, схожу на оркестрову партитуру, і Unicode не може це підтримати.

Але давайте заради аргументу припустимо, що всі мови, навіть чужі мови, можуть бути виражені у вигляді лінійної послідовності символів, вибраних з кінцевого набору. Чи Unicode достатньо великий для вторгнення прибульців? Наразі Unicode має менше мільйона непризначених кодових точок. Китайська мова містить сто тисяч символів відповідно до найвичерпнішого китайського словника (не всі вони в даний час підтримуються Unicode як окремі символи). Отже, лише десять мов зі складною мовою китайської використовували б усі Unicode. На землі у нас сотні різних систем письма, але, на щастя, більшість бувають алфавітними, а не ідеографічними, тому містять невелику кількість символів. Якби всі письмові мови використовували такі ідеограми, як китайська, Unicode навіть не був би достатньо великим для землі. Використання алфавітів походить від мови, яка використовує лише обмежену кількість фонем, але це особливо для фізіології людини. Тож навіть одна чужа планета, яка має лише десяток ідеографічних систем письма, може перевищити те, що може підтримувати Unicode. Тепер поміркуйте, чи цей інопланетянин вже вторгся до інших планет перед землею і включив їхні системи письма в набір символів, які потрібно підтримувати.

Розширення або модифікація поточних кодувань або введення нових кодувань це не вирішить, оскільки обмеження полягає в кількості кодових точок, що підтримуються Unicode.

Тож відповідь, швидше за все, ні.


5
Вам бракує фантазії. Хореографи танцювальної музики мають багато мови та термінології, які вони можуть використовувати для опису та навчання танців, які мають виконувати актори сцени. Якби ми дізналися про те, що спілкуються з бджолами, ми б точно могли розробити для цього письмову термінологію. Адже більшість наших писемних мов сьогодні - це кодування звуку. Рух кодування не все відрізняється від кодування звуку.
whatsisname

3
Частини цієї відповіді хороші, але сказати: "Мало того, що вона не має письмової форми, вона не може бути представлена ​​у письмовій формі", це просто неправильно. Все, що передає інформацію, може бути зведене до бітів, і все, що зводиться до бітів, може бути перетворене в майже будь-який потік символів, який вам подобається.
Стівен Бернап

2
@StevenBurnap Щоправда, але Unicode - це не просто послідовність бітів. Це спосіб інтерпретації цих бітів, тобто досить жорсткий. Так, набір символів Unicode можна було б розширити таким чином, щоб відображати що-небудь від зображень до інструкцій з ЧПУ, але це була б зовсім інша істота.
Оуен

4
Майте на увазі, що описані символи unicode (у більшості мов) є моделями зміни тиску повітря, і що для більшості мов це фактично виконує досить хитру роботу, фактично відповідає цим шаблонам.
Стівен Бернап

3
Отже, ви маєте на увазі речення "літати 45 секунд із сонцем 15 градусів зліва, потім літати 10 секунд із сонцем 10 градусів праворуч" неможливо? Це, безумовно, вимагає положення сонця в той час як контекст.
Стівен Бернап
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.