Сможет ли UTF-8 поддерживать включение огромного инопланетного языка с миллионами новых персонажей?

86

Если произошло инопланетное вторжение, и мы были вынуждены поддерживать их языки во всех наших существующих компьютерных системах, разработан ли UTF-8 таким образом, чтобы учесть их возможно огромное количество символов?

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

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

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

Qix
источник
16
"Поддержи свои языки " (мой акцент) ... Сколько? Мы уверены, что языки могут быть разбиты на символы? Может быть, язык основан на пространственных отношениях. - см. Тед Чан "История твоей жизни", Истории твоей жизни и другие . В лучшем случае это просто вопрос «максимум вещей в X-байтах» (не по теме). В худшем случае это спекулятивная ерунда. (непонятно, о чем ты спрашиваешь)
Скудный Роджер
6
@ScantRoger Принятый ответ отлично справляется с ответом на вопрос, как и предполагалось.
Qix
11
Принятый ответ отлично показывает нам факты UTF-8, UTF-16 и UTF-32. Вы можете просто посмотреть это в Википедии. Что касается "инопланетного вторжения", я не вижу, как ответ решает это вообще.
Скудный Роджер
10
Связано (при переполнении стека): достаточно ли UTF-8 для всех распространенных языков?
Яннис
9
Юникод не поддерживает языки, он поддерживает символы - глифы, используемые для представления значения в письменной форме. Многие человеческие языки не имеют сценария и, следовательно, не могут поддерживаться юникодом. Не говоря уже о том, что многие животные общаются, но не имеют письменного языка. Связь с помощью, скажем, иллюстраций или бессловесных комиксов не может поддерживаться юникодом, так как набор глифов не является конечным. По определению мы не знаем, как инопланетяне общаются, поэтому на ваш вопрос невозможно ответить. Если вы просто хотите узнать, сколько разных символов поддерживает юникод, вам, вероятно, следует уточнить :)
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 (она уже мертва в мобильном пространстве)
slebetman
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 не безумны.
Во
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, чтобы угодить нашим новым повелителям инопланетян ;-)

Boldewyn
источник
8
В настоящее время UTF-8 ограничен только кодами до 0x10FFFF, но это только для совместимости с UTF-16. Если возникла необходимость в его расширении, нет никакой двусмысленности в том, как расширить его с помощью кодовых точек до 0x7FFFFFFF (то есть 2³¹-1). Но помимо этого я видел противоречивые определения. Одно определение, которое я видел, имеет 111111xxв качестве возможного первого байта, за которым следуют пять байтов расширения, максимум максимум 2 ³2 кодовых точек. Но это совместимо только с тем определением, которое вы упомянули для первых 2–3 кодовых точек.
Касперд
2
Да, Википедия что-то говорит о UTF-16, когда на самом деле они означают Unicode или ISO 10646 (в зависимости от контекста). На самом деле, начиная с RFC 3629, UTF-8 не определен за пределами U + 10FFFF (или F4 8F BF BFв байтах UTF-8). Итак, все, что я упоминаю здесь, кроме этого, является чистой спекуляцией. Конечно, кто-то может подумать о других расширениях, где старший первый байт означает следование какой-то другой структуре (и, мы надеемся, не уничтожая самосинхронизацию в процессе). Я попытался завершить байтовую схему, чтобы быть как можно ближе к реальному UTF-8.
Болдевин
4
Это 4 триллиона, а не квадриллион.
Ypnypn
1
Строго не обязательно, чтобы число следующих байтов всегда было на единицу меньше числа старших в первом байте. Perl фактически поддерживает (с 2000 года) внутренний вариант UTF-8, где 5, 6 и 7-байтовые формы совпадают с этим ответом, но FFвводит 13-байтовую кодовую единицу, способную хранить 72 бита. Все, что больше 2 ^ 36, очень дорого, но оно позволяет кодировать 64-битное целое, а затем и другое.
Хоббс
7

RFC3629 ограничивает UTF-8 максимум четырьмя байтами на символ, с максимальным значением 0x10FFFF, что позволяет максимум 1112 064 кодовых точек. Очевидно, что это ограничение можно было бы снять и расширить стандарт, но это докажет серьезное изменение для существующего кода, который работает до этого предела.

С точки зрения файла данных, это не было бы серьезным изменением, поскольку стандарт работает на основе того, что, если установлен старший значащий бит (MSB) каждого байта, то следующий байт является частью кодирования. Еще до RFC3629 стандарт был ограничен 31 битом, в результате чего старший бит четвертого байта не был установлен.

Расширение стандарта за пределы 0x10FFFF нарушит частичную совместимость данных UTF-8 с UTF-16.

Дэвид Арно
источник
5
Таким образом, теоретически, данные будут обратно совместимы, но код не будет изначально совместим с модификацией стандарта?
Qix
2
@ Qix, это верный момент. Любой существующий файл UTF-8, естественно, будет совместим, например, с максимум 6 байтами, чтобы вместить еще миллионы кодовых точек, но многие существующие библиотеки, предназначенные для обработки UTF-8, скорее всего, не будут обрабатывать это расширение.
Дэвид Арно,
4
UTF-16 сломался бы смертельно. По сути, он может поддерживать только кодовые точки до 0x10FFFF.
gnasher729
1
@ gnasher729: Не такая большая проблема, как вы думаете. Пре-Юникод решил эту проблему с помощью значений сдвига (Shift JIS для японского языка). Они просто помечают зарезервированный / неиспользованный символ (0xFFFD?) Как «символ сдвига», который сдвигает кодировку в более расширенную форму. Вероятно, UTF32.
Mooing Duck
4

На самом деле, только 2 кода Unicode-кода означают бесконечное количество символов, если они объединяют символы.

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

С помощью этого трюка нет необходимости выходить за пределы количества кодовых точек, которые в настоящее время могут быть закодированы в UTF-8 или UTF-16.

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

Оуэн
источник
Это только в том случае, если символы на инопланетном языке на самом деле состоят из более ограниченного набора графем. Это может быть не так.
JacquesB
1
Насколько я знаю, не существует требования, чтобы объединение символов относилось к отдельным графемам. В Unicode FAQ об этом ничего не говорится, но у меня сложилось впечатление, что движку компоновки не составит труда поддержать комбинирование последовательностей, не являющихся последовательностями графем, поскольку в любом случае потребуется предварительно составленный глиф.
Оуэн
Как долго живут эти инопланетяне и сколько персонажей, которые невозможно разложить в графемы, они могут выучить в детстве? И сохраняет ли предварительно составленный Hangul свое байтовое преимущество перед разложенным Hangul даже после gzip?
Дамиан Йеррик
-2

Изменить: теперь вопрос говорит «миллионы новых персонажей». Это позволяет легко ответить:

Нет . Utf-8 - это кодировка Unicode. Unicode имеет кодовое пространство, которое допускает 1,114,112 различных кодовых точек , и в настоящее время не назначено менее миллиона. Поэтому невозможно поддерживать миллионы новых персонажей в Юникоде. По определению ни одна кодировка Unicode не может поддерживать больше символов, чем определено Unicode. (Конечно, вы можете обмануть, кодируя уровень дальше - любой тип данных может быть представлен всего двумя символами.)


Чтобы ответить на оригинальный вопрос:

Юникод не поддерживает языки как таковые, он поддерживает символы - символы, используемые для представления языка в письменной форме.

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

Еще хуже что-то вроде языка пчел. Он не только не имеет письменной формы, но и не может быть осмысленно представлен в письменной форме. Язык - это своего рода танец, который в основном указывает направление, но зависит от текущего положения солнца. Следовательно, танец имеет информационную ценность только в том месте и времени, когда он исполняется. Символическое или текстовое представление должно включать информацию (местоположение, положение солнца), которую язык пчел в настоящее время не может выразить.

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

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

Но давайте в качестве аргумента предположим, что все языки, даже иностранные, могут быть выражены в виде линейной последовательности символов, выбранных из конечного набора. Достаточно ли велик Unicode для вторжения инопланетян? В настоящее время Unicode имеет менее миллиона неназначенных кодов. Китайский язык содержит сто тысяч символов в соответствии с наиболее полным китайским словарем (не все они в настоящее время поддерживаются Unicode как отдельные символы). Таким образом, только десять языков со сложным китайским языком израсходовали бы весь Юникод. На земле у нас есть сотни различных систем письма, но, к счастью, большинство алфавитных, а не идеографических и, следовательно, содержит небольшое количество символов. Если бы все письменные языки использовали идеограммы, такие как китайский, Unicode даже не был бы достаточно большим для земли. Использование алфавитов происходит от речи, которая использует только ограниченное количество фонем, но это характерно для физиологии человека. Так что даже одна инопланетная планета с дюжиной идеографических систем письма может превосходить то, что может поддерживать Юникод. Теперь рассмотрим, если этот инопланетянин уже вторгся на другие планеты до Земли и включил их системы письма в набор символов, которые должны поддерживаться.

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

Так что ответ, скорее всего, нет.

JacquesB
источник
5
Вам не хватает воображения. Хореографы танцев имеют много языка и терминологии, которые они могут использовать для описания и обучения танцам, которые должны исполнять актеры. Если бы мы узнали о том, что пчелы общались, мы могли бы определенно разработать для этого письменную терминологию. В конце концов, большинство наших письменных языков сегодня являются кодировкой звука. Движение кодирования не сильно отличается от кодирования звука.
whatsisname
3
Части этого ответа хороши, но сказать: «Мало того, что он не имеет письменной формы, он не может быть представлен в письменной форме», просто неправильно. Все, что передает информацию, может быть уменьшено до битов, а все, что сокращено до битов, может быть преобразовано практически в любой поток символов, который вам нравится.
Gort the Robot
2
@StevenBurnap Верно, но Unicode - это больше, чем просто последовательность битов. Это способ интерпретации этих битов, который довольно жесткий. Да, набор символов Unicode может быть расширен для представления чего угодно, от изображений до инструкций ЧПУ, но это будет совсем другое существо.
Оуэн
4
Имейте в виду, что символы Unicode (на большинстве языков) описывают шаблоны изменения давления воздуха, и что для большинства языков это действительно довольно дурацкая работа по сопоставлению этих шаблонов.
Gort the Robot
3
То есть вы имеете в виду, что предложение «лететь 45 секунд с солнцем на 15 градусов влево, а затем 10 секунд с солнцем на 10 градусов вправо» невозможно? Это, безусловно, требует положения солнца в то время как контекст.
Gort the Robot