Если произошло инопланетное вторжение, и мы были вынуждены поддерживать их языки во всех наших существующих компьютерных системах, разработан ли UTF-8 таким образом, чтобы учесть их возможно огромное количество символов?
(Конечно, мы не знаем, есть ли у инопланетян языки на самом деле, говорят ли они или как они общаются, но ради аргумента, просто представьте, что они есть).
Например, если их язык состоит из миллионов вновь обретенных глифов, символов и / или комбинированных символов , может ли UTF-8 теоретически быть расширен без прерывания, чтобы включить эти новые глифы и при этом поддерживать все существующее программное обеспечение?
Меня больше интересует, значительно ли превзошли глифы текущие ограничения по размеру и потребовалось ли больше байтов для представления одного глифа. Если UTF-8 не может быть расширен, доказывает ли это, что единственным преимуществом по сравнению с UTF-32 является просто размер младших символов?
Ответы:
Стандарт 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 с лица земли .
источник
wfopen
системного вызова или чего-то еще, это UTF8 полностью. Черт, даже Python и Java - оба определяют строки как UTF-16 по историческим причинам - не хранят строки как UTF-16, за исключением случаев, когда это необходимо .. большие преимущества памяти и отсутствие падений производительности (и это несмотря на дополнительный код для обработки преобразований) память дорогая, процессор дешевый). То же самое касается Android - JString NDK - UTF8, главным образом потому, что инженеры Google не безумны.Если UTF-8 действительно должен быть расширен, мы должны рассмотреть абсолютный максимум, который он может представлять. UTF-8 имеет следующую структуру:
(бесстыдно скопировано из RFC .) Мы видим, что первый байт всегда контролирует, сколько последующих байтов составляют текущий символ.
Если мы расширим его до 8 байт, мы получим дополнительные не-Unicode представления
Вычисляя максимально возможные представления, которые эта техника позволяет нам прийти к
или в базе 10:
что дает нам максимальное количество представлений как 4 468 982 745 216.
Итак, если этих 4 миллиардов ( или триллионов, как вам угодно ) символов достаточно, чтобы представлять языки инопланетян, я вполне уверен, что мы можем, с минимальными усилиями, расширить текущий UTF-8, чтобы угодить нашим новым повелителям инопланетян ;-)
источник
111111xx
в качестве возможного первого байта, за которым следуют пять байтов расширения, максимум максимум 2 ³2 кодовых точек. Но это совместимо только с тем определением, которое вы упомянули для первых 2–3 кодовых точек.F4 8F BF BF
в байтах UTF-8). Итак, все, что я упоминаю здесь, кроме этого, является чистой спекуляцией. Конечно, кто-то может подумать о других расширениях, где старший первый байт означает следование какой-то другой структуре (и, мы надеемся, не уничтожая самосинхронизацию в процессе). Я попытался завершить байтовую схему, чтобы быть как можно ближе к реальному UTF-8.FF
вводит 13-байтовую кодовую единицу, способную хранить 72 бита. Все, что больше 2 ^ 36, очень дорого, но оно позволяет кодировать 64-битное целое, а затем и другое.RFC3629 ограничивает UTF-8 максимум четырьмя байтами на символ, с максимальным значением 0x10FFFF, что позволяет максимум 1112 064 кодовых точек. Очевидно, что это ограничение можно было бы снять и расширить стандарт, но это докажет серьезное изменение для существующего кода, который работает до этого предела.
С точки зрения файла данных, это не было бы серьезным изменением, поскольку стандарт работает на основе того, что, если установлен старший значащий бит (MSB) каждого байта, то следующий байт является частью кодирования. Еще до RFC3629 стандарт был ограничен 31 битом, в результате чего старший бит четвертого байта не был установлен.
Расширение стандарта за пределы 0x10FFFF нарушит частичную совместимость данных UTF-8 с UTF-16.
источник
На самом деле, только 2 кода Unicode-кода означают бесконечное количество символов, если они объединяют символы.
Сравните, например, два способа кодирования Юникода для корейского алфавита хангыль : слоги хангыль и хангыль джамо . Символ 웃 in
Hangul Syllabels
представляет собой единственную кодовую точку,C6C3
тогда как вHangul Jamo
нем есть три кодовые точки110B
(ㅇ)116E
(ㅜ)11B9
(ㅅ). Очевидно, что использование комбинированных символов занимает значительно меньше кодовых точек, но менее эффективно для записи, поскольку для записи каждого символа требуется больше байтов.С помощью этого трюка нет необходимости выходить за пределы количества кодовых точек, которые в настоящее время могут быть закодированы в UTF-8 или UTF-16.
Я предполагаю, что все сводится к тому, насколько обиженными были бы инопланетяне, если бы их языку требовалось намного больше байтов на сообщение, чем земным языкам. Если они не возражают, скажем, представлять каждый из своих миллионов символов, используя, скажем, беспорядочную комбинацию из 100 000 символов, то проблем нет; с другой стороны, если из-за необходимости использовать больше байтов, чем земляне, они чувствуют себя гражданами второго сорта, мы можем столкнуться с некоторым конфликтом ( мало чем отличающимся от того, что мы уже наблюдаем с UTF-8 ).
источник
Изменить: теперь вопрос говорит «миллионы новых персонажей». Это позволяет легко ответить:
Нет . Utf-8 - это кодировка Unicode. Unicode имеет кодовое пространство, которое допускает 1,114,112 различных кодовых точек , и в настоящее время не назначено менее миллиона. Поэтому невозможно поддерживать миллионы новых персонажей в Юникоде. По определению ни одна кодировка Unicode не может поддерживать больше символов, чем определено Unicode. (Конечно, вы можете обмануть, кодируя уровень дальше - любой тип данных может быть представлен всего двумя символами.)
Чтобы ответить на оригинальный вопрос:
Юникод не поддерживает языки как таковые, он поддерживает символы - символы, используемые для представления языка в письменной форме.
Не все человеческие языки имеют письменное представление, поэтому не все человеческие языки могут поддерживаться Unicode. Кроме того, многие животные общаются, но не имеют письменного языка. Например, киты имеют форму общения, которая достаточно сложна, чтобы называть язык, но не имеет письменной формы (и не может быть захвачена существующей фонетической нотацией). Так что даже Unicode не поддерживает даже все языки на земле.
Еще хуже что-то вроде языка пчел. Он не только не имеет письменной формы, но и не может быть осмысленно представлен в письменной форме. Язык - это своего рода танец, который в основном указывает направление, но зависит от текущего положения солнца. Следовательно, танец имеет информационную ценность только в том месте и времени, когда он исполняется. Символическое или текстовое представление должно включать информацию (местоположение, положение солнца), которую язык пчел в настоящее время не может выразить.
Даже письменная или символическая форма общения может оказаться невозможной для представления в Юникоде. Например, иллюстрации или комиксы без слов не могут поддерживаться Юникодом, поскольку набор глифов не является конечным. Вы заметите много графического общения в международных условиях, таких как аэропорт, поэтому немыслимо, чтобы гонка космических пришельцев эволюционировала с использованием изобразительного языка.
Даже если у инопланетной расы был язык с системой письма с конечным набором символов, эта система не могла бы поддерживаться в Юникоде. Unicode ожидает, что запись будет линейной последовательностью символов. Нотация музыки - пример системы письма, которая не может быть полностью представлена в Юникоде, потому что значение закодировано и в выборе символов и в вертикальном и горизонтальном размещении. (Unicode поддерживает отдельные музыкальные символы, но не может кодировать партитуру.) У инопланетной расы, которая общалась с использованием полифонической музыки (нередко) или канала связи аналогичной сложности, вполне могла бы быть система письма, похожая на оркестровую партитуру, и Юникод не может поддерживать это.
Но давайте в качестве аргумента предположим, что все языки, даже иностранные, могут быть выражены в виде линейной последовательности символов, выбранных из конечного набора. Достаточно ли велик Unicode для вторжения инопланетян? В настоящее время Unicode имеет менее миллиона неназначенных кодов. Китайский язык содержит сто тысяч символов в соответствии с наиболее полным китайским словарем (не все они в настоящее время поддерживаются Unicode как отдельные символы). Таким образом, только десять языков со сложным китайским языком израсходовали бы весь Юникод. На земле у нас есть сотни различных систем письма, но, к счастью, большинство алфавитных, а не идеографических и, следовательно, содержит небольшое количество символов. Если бы все письменные языки использовали идеограммы, такие как китайский, Unicode даже не был бы достаточно большим для земли. Использование алфавитов происходит от речи, которая использует только ограниченное количество фонем, но это характерно для физиологии человека. Так что даже одна инопланетная планета с дюжиной идеографических систем письма может превосходить то, что может поддерживать Юникод. Теперь рассмотрим, если этот инопланетянин уже вторгся на другие планеты до Земли и включил их системы письма в набор символов, которые должны поддерживаться.
Расширение или модификация текущих кодировок или введение новых кодировок не решат эту проблему, поскольку ограничение заключается в количестве кодовых точек, поддерживаемых Unicode.
Так что ответ, скорее всего, нет.
источник