Генерировать URI-дружественные кодовые точки Unicode из счетчика целых чисел - PullRequest
1 голос
/ 06 июня 2011

Мне нужно отобразить счетчик целых чисел на удобные для URI кодовые точки Unicode (я пишу сокращающий URL-адрес, не ограниченный типичным ASCII base-62, 0-9a-zA-Z).У меня уже есть опытный образец;веб-сервер получает GET-запросы на кодированное в% значение UTF-8 кодовой точки Unicode (во всяком случае, от Firefox), поэтому его очень легко обрабатывать.

Теперь трудная часть, которую я достигпреобразует первичный ключ сокращаемого URL - целое число - в пригодные для использования кодовые точки Unicode (код точек , для которых, когда я превышаю число отдельных кодовых точек, я могуиспользовать и использовать несколько кодов).Прямо сейчас мой счетчик иногда создает неверные кодовые точки, которые нельзя использовать.Я немного прочитал об Unicode и понимаю, что нужно учитывать множество вещей:

  • Не отображаемые символы
    • Нехарактерные символы
    • Контролькоды
    • Высокие / Низкие суррогаты
    • Частные кодовые точки
    • Форматирование, символы биди
  • Объединение символов / диакритических знаков
  • Пробелы
  • Дублирующиеся / повторяющиеся символы
  • Зарезервированная URI-схема символов, например /, +, ., ?(не Unicode)

Мое простое решение состоит в том, чтобы создать набор кодовых точек для сопоставления с максимально возможным количеством используемых, избегая диапазонов «плохих символов», указанных выше, а такжекак включающие только кодовые точки, которые сами по себе также являются границами кластера графем , то есть не изменяемыми путем комбинирования символов / диакритических знаков (хотя я полагаю, если я добавлю в черный список диакритические кодовые точки, это не имеет значения).Это справедливое предположение?Есть ли относительно простой способ создать такой набор кодов?

Я видел ссылки на такие инструменты, как unichars и uniprops , но я не знаюМне кажется, я понимаю свойства Unicode достаточно, чтобы понять, помогут ли они мне в этой ситуации или нет.Я не заинтересован в полном исчерпывающем списке используемых кодовых точек, но охват> 70% был бы потрясающим.Я гораздо более заинтересован в том, чтобы скрыть «плохие» кодовые точки.

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

Заранее извиняюсь, если моя терминология Unicode неверна.

TL; DR

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

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

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

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

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

1 голос
/ 15 июня 2011

Самым простым решением, которое я нашел, было то, на которое я случайно наткнулся: это официальное Свойства Unicode Веб-приложение JSP.Я полагаю, что это запрос, который я использовал:

[:Diacritic=No:]&[:Noncharacter_Code_Point=No:]&[:Deprecated=No:]&[:White_Space=No:]&[:General_Category=Math_Symbol:]|[:General_Category=Symbol:]|[:General_Category=Letter:]|[:General_Category=Punctuation:]|[:General_Category=Currency_Symbol:]|[:General_Category=Number:]&[:General_Category!=Modifier_Letter:]&[:General_Category!=Modifier_Symbol:]

, который дает 107,401 кодовых точек.Затем я отфильтровал зарезервированные символы URI и несколько других, чтобы быть в безопасности, прежде чем сохранять их в своей базе данных.Вот мой рабочий прототип , в нерекламированной бета-версии.

Некоторые другие попытки, которые я безуспешно пробовал:

Я попробовал утилиту Perl unicharsЯ считаю, что он способен делать то, что мне нужно, но моя версия Perl (5.10.1) связана со стандартом Unicode 5.x;Я не смог быстро найти инструкции по обновлению до стандарта Unicode 6.0.0.Я подумывал написать приложение на Ruby, подобное unichars, но моя установка на Ruby также соответствует стандарту Unicode 5.2 (Ruby 1.9.2, ActiveSupport 3.0.8).Я нашел способ явно загрузить другую таблицу Unicode, но документации для нее нет, и файл unicode_tables.dat в моей системе - это двоичный файл, поэтому простого ответа на него нет.

Я также подумал о синтаксическом анализе файла UnicodeData.txt стандарта Unicode 6.0.0 сам, но, очевидно, отсутствуют диапазоны кодовых точек, например Han, что потребовало бы от меня еще одного файла в егособственный формат .

...