Как ввести Unicode не BMP (шестнадцатеричный с более чем 4 символами) в качестве ввода в Mathematica - PullRequest
9 голосов
/ 09 ноября 2011

Описание проблемы: 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-битное кодирование).Один из них, как пользователь определенного программного пакета, не должен исходить из того, что, как только программное обеспечение говорит, что оно поддерживает Unicode, оно поддерживает универсальный набор Unicode.

Ответы [ 2 ]

9 голосов
/ 09 ноября 2011

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

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

Там нет необходимости для 32-разрядногокодировка для обработки более ~ 65000 символов Юникода.Наиболее распространенные кодировки, используемые для 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.org (по крайней мере, для CJK они есть).

См. Также

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

Если вы собираетесь работать с CКроме того, вы можете столкнуться и с этой другой проблемой: Получение внешнего интерфейса Mathematica для поддержки опции FontFamily

5 голосов
/ 09 ноября 2011

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

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

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

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

...