Определить все коды скриптов ISO 15924 в строке JavaScript

Я ищу эффективный способ взять строку JavaScript и вернуть все скрипты. которые встречаются в этой строке.

Полный UTF-16, включая символы «астрального» плана/не-BMP, для которых требуются суррогатные пары, должен обрабатываться правильно. Возможно, это главная проблема, поскольку JavaScript не поддерживает UTF-16.

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

Пример:

stringToIso15924("παν語");

вернет что-то вроде:

[ "Grek", "Hani" ]

Я использую node.js и некоторые библиотеки Unicode, такие как XRegExp и unorm, поэтому я не возражаю против добавления других библиотек, которые уже могут обрабатывать или упрощать такую ​​функцию.

Я не знаю библиотеки JavaScript, которая может искать свойства символов, такие как коды сценариев, так что это, вероятно, вторая часть проблемы.

Третья часть проблемы заключается в том, чтобы просто избежать неэффективности.


person hippietrail    schedule 09.05.2013    source источник
comment
Есть ли какой-либо источник (например, таблица), на который вы можете сослаться, который уже сопоставляет (надеюсь, диапазоны) символов UTF-16 (по их коду) с кодами сценариев?   -  person Paul S.    schedule 09.05.2013
comment
Кажется, я нашел начало истории о том, как свойство Script символа Unicode связано с ISO 15924. unicode.org/reports/tr24/#Relation_To_ISO15924   -  person minopret    schedule 09.05.2013
comment
@ПолС. Я не знаю, есть ли исходный код, уже подготовленный для JavaScript, но есть необработанные UnicodeData. txt на сайте Unicode, который я обрабатывал для таких вещей в прошлом в Python и Perl.   -  person hippietrail    schedule 09.05.2013
comment
Если вы хотите создать свою собственную функцию сопоставления, это может быть полезнее, чем каждая буква по отдельности unicode .org/Public/UNIDATA/Scripts.txt . Теперь задача состоит в том, чтобы вычислить код utf-16 вашего персонажа, а затем выполнить цикл, пока вы не найдете, в какой группе он находится.   -  person Paul S.    schedule 09.05.2013
comment
Получение пар из кода utf-16 – вы хочу обратное. Самым трудоемким будет создание Array [{start: 0x0000, end: 0x0040, script: 'Common'}, {start: 0x0041, end: 0x005A, script: 'Latin'}, ...], чтобы вы могли найти свой скрипт. Если битых групп очень много, может быть стоит массив с индексом для каждого символа, но это будет занимать много памяти (обменивается на cpu). Для получения результатов просто добавьте имена скриптов в качестве ключей к пустому объекту, а затем просто выполните Object.keys   -  person Paul S.    schedule 09.05.2013
comment
@ПолС. Ах да, я считаю, что UnicodeData - это необработанные данные, и есть куча других файлов производных данных. Однажды я реализовал что-то связанное с использованием бинарного поиска. Вероятно, лучше создать таблицу один раз и включить ее в сценарий как необработанные данные, а не вычислять ее в реальном времени. Но, может быть, это уже есть в какой-то js-библиотеке?   -  person hippietrail    schedule 09.05.2013


Ответы (1)


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

person dda    schedule 09.05.2013
comment
Обращались в Гиннесс за этой функцией еще... ? Спасибо! - person Eirik Birkeland; 27.12.2015