Как ввести юникод, отличный от BMP (шестнадцатеричный с более чем 4 символами), в качестве входных данных для Mathematica

Описание проблемы: Mathematica использует "\:nnnn" в качестве синтаксиса для ввода в формате Unicode. Например, если мы введем "\:6c34", мы получим "水" («вода» на китайском языке). Но что, если кто-то хочет войти "\:1f618" (целуя лицо). Когда я попробовал это, я получил "ὡ8", а не "a face throwing a kiss". Итак, Mathematica оценивает "\:1f61" до того, как я ввел "8".

Вопрос: как мы можем отсрочить эту оценку или как вообще ввести любой ввод в формате Unicode (например, шестнадцатеричный с более чем 4 символами)?

Программно-аппаратная платформа: я запускаю Mathematica 8 на Intel Mac. Я пробовал как версию Mathematica для командной строки, так и блокнот Mathematica, они ведут себя одинаково.

Спасибо.


Размышления: Unicode — это расширяемый стандарт, и он может расти (и он действительно растет: )). Программные системы, которые реализуют этот стандарт, могут реализовывать только подмножество этого стандарта, чтобы быть действительными и полезными (8-битное, 16-битное или 32-битное кодирование). Человек, как пользователь определенного программного пакета, не должен делать предположение, что, как только программное обеспечение заявляет, что поддерживает юникод, оно поддерживает универсальный набор юникода.


person Ning    schedule 09.11.2011    source источник
comment
Mathematica практически не поддерживает кодовые точки Unicode, для которых требуется более 16 бит. См., например, Чтение текстового файла в кодировке UTF-8 в Mathematica.   -  person WReach    schedule 09.11.2011
comment
Unicode 2.0 расширил диапазон возможных кодовых точек с помощью суррогатного механизма все 15 лет назад, и они по-прежнему давали людям почти 5 лет, чтобы освоить программу — более 10 лет назад. Просто нет никакого оправдания тому, что эти корявые старые программы не поддерживают полный Unicode. 15 лет вполне достаточно для любого апгрейда.   -  person tchrist    schedule 09.11.2011
comment
Интересно, что я могу скопировать/вставить 32-битный символ Юникода в блокнот Mathematica, и он выглядит правильно, но не сохраняется при сохранении и перезагрузке блокнота. Он преобразуется в два 16-битных символа Юникода.   -  person Simon    schedule 09.11.2011


Ответы (2)


Короткий ответ: вы не можете этого сделать, потому что Mathematica не поддерживает эти символы должным образом. См. в конце поста некоторые обходные пути.

Просто чтобы прояснить некоторые моменты:

Нет нет необходимости в 32-битной кодировке для обработки более ~65000 символов Unicode. Наиболее распространенными кодировками, используемыми для Unicode, UTF-8 и UTF-16, являются многобайтовые кодировки, означающие, что для представления символов используется переменное количество байтов. UTF-16 может использовать 2 или 4 байта для представления символа. Ядро Mathematica будет интерпретировать каждую 2-байтовую последовательность как одиночный символ в строке, что иногда приводит к некоторым недопустимым символам (при встрече с 4-байтовой последовательностью). Это можно считать ошибкой. Внешний интерфейс довольно капризный в отношении того, как он обрабатывает 4-байтовые последовательности, что определенно является ошибкой.

Ограниченное временное решение

При работе строго в ядре (например, при чтении данных Unicode из файла) я иногда использую эту функцию в качестве обходного пути, чтобы получить фактическую кодовую точку Unicode для 2-элементных (4-байтовых) последовательностей UTF-16:

toCodePoint[{a_, b_}] /; 16^^d800 <= a <= 16^^dbff && 16^^dc00 <= b <= 16^^dfff := (a - 16^^d800)*2^10 + (b - 16^^dc00) + 16^4

Ты можешь использовать

Split[ToCharacterCode[str], If[16^^d800 <= # <= 16^^dbff, True] &]

правильно разделить строку UTF-16 на символы Unicode (длина-один или длина-два, в зависимости от символа).

Это уродливый и неудобный обходной путь, и он не позволит вам отображать что-либо из этих символов во внешнем интерфейсе, если вы также не придумаете какой-нибудь хак для этого, например. импорт эталонных изображений глифов с unicode.org (по крайней мере, для CJK они у них есть).

См. также

См. мой предыдущий вопрос по той же теме: Чтение UTF-8 закодированный текстовый файл в системе Mathematica

Если вы собираетесь работать с китайским языком, вы также можете столкнуться с этой другой проблемой: -fontfamily-option">Заставить интерфейс Mathematica подчиняться параметру FontFamily

person Szabolcs    schedule 09.11.2011

Согласно этой странице справки Mathematica 8:

Mathematica supports both 8- and 16-bit raw character encodings.

Предположительно, они говорят, что не поддерживают 32-битные кодировки, которые необходимы для поддержки желаемого символа.

В качестве дополнительного доказательства (при отсутствии четкого указания в документации) в списке поддерживаемых кодировок на той же странице нет 32-битных кодировок. 32-битные кодировки, по-видимому, поддерживаются только в MathLink. Я полагаю, что не было достаточного пользовательского спроса.

person Codie CodeMonkey    schedule 09.11.2011
comment
Чтобы прояснить некоторую путаницу: нет необходимости поддерживать 32-битную кодировку для правильной поддержки Unicode. UTF-16 — это 16-битная кодировка, но она может кодировать все символы Unicode, более ~ 65000 из них, за счет использования блоков из одного слова (2 байта) и двух слов (4 байта). Mathematica просто не может правильно обрабатывать единицы из двух слов. Из комментариев к моему ранее связанному вопросу у меня сложилось впечатление, что это ошибка, поскольку иногда они отображаются правильно в Windows 7, но после сохранения и открытия блокнота они повреждаются. stackoverflow.com/q/5597013/211232 - person Szabolcs; 09.11.2011