Найти код Unicode для объединенных символов - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь понять, как работает Unicode в представлении определенных комбинаций символов. Например, если я объединю следующие три символа девенгари (хинди):

न + ◌् ( символ диакритической комбинации ) + न

Я должен получить следующее один (вторая ссылка здесь) :

न्न

Теперь для первых трех символов я смог найти соответствующие символы Unicode , используя Character Map в Windows, и получил:

न -> UTF-16 Кодировка: 0x0928

◌् -> UTF-16 Кодировка: 0x094D

Или, что эквивалентно, в представлении Unicode xml:

न -> "& # 2344";

◌् -> "& # 2381";

Теперь, несмотря на мои попытки найти комбинации этих трех, я не смог в любом случае, этот символ न्न должен иметь представление Unicode, верно?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

Ваш символ представляет собой тройную комбинацию (Python используется для ординалов и имен):

>>> from unicodedata import ud
>>> s='न्न'
>>> len(s)
3
>>> for c in s: print(f'{c}   U+{ord(c):04X} {ud.name(c)}')
... 
न   U+0928 DEVANAGARI LETTER NA
्   U+094D DEVANAGARI SIGN VIRAMA
न   U+0928 DEVANAGARI LETTER NA

Для его символа нет единственного символа Unicode.Нормализация объединяет кодовые точки, если это возможно:

>>> len(ud.normalize('NFC',s))
3
2 голосов
/ 04 июня 2019

Юникод - это символ "код".Не о глифах (поэтому цифры).

У кодовой точки Unicode другая интерпретация.Обычно печатный символ или объединяющий символ (который изменит предыдущие символы).

Кроме того, шрифты могут объединять и другие символы (не только с объединением кодовой точки Юникода).На латинских шрифтах (печатными буквами) это очень редко, но на индийском языке это правило.Но в индийских языках есть и другие правила о том, как комбинировать или объединять символы.Вы можете определить это со шрифтами, с модификатором языка (например, в HTML), или / и с zero width non-joiner и zero width joiner.Это помечает намерение: хотите ли вы, чтобы два символа отображались как независимые (например, noo-joiner), или вы хотите, чтобы они отображались как комбинированные (также если шрифты предпочтут такую ​​комбинацию как дизъюнкт)?

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

Примечание: есть DEVANAGARI LETTER NNNA ऩ, иDEVANAGARI LETTER NNA ण.Я не знаю индийских языков, но должна ли ННА быть похожей на вашего персонажа?(Но они кажутся совершенно разными).

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

0 голосов
/ 05 июня 2019

Давайте сначала определим некоторые термины точно.

Юникод различает символы и графемы (или кластеры графем).Вы говорите о символах, но на самом деле вы имеете в виду символы.Символ - это просто свойство символа:

U+0928 ‹न› \N{DEVANAGARI LETTER NA} Other_Letter
U+25CC ‹◌› \N{DOTTED CIRCLE} Other_Symbol
U+094D ‹◌्› \N{DEVANAGARI SIGN VIRAMA} Combining_Mark

Каждый символ имеет числовой идентификатор (четыре или пять шестнадцатеричных цифр), который называется кодовой точкой.


Все предыдущиенизкоуровневая детализация, которая не должна касаться конечных пользователей или программистов, имеющих дело с текстом, она должна иметь отношение только к нескольким программистам, реализующим Unicode для языка программирования.(К сожалению, большинство программного обеспечения - включая языки программирования - сломано, плохо спроектировано или плохо реализовано, поэтому абстракция протекает.) Один уровень Unicode, न्न состоит из двух графем:

› perl -Mutf8 -E 'say scalar split /\b{g}/, "न्न"'
2
› perl6 -e '"न्न".chars.say'
2
› node -e 'console.log((new(require("grapheme-splitter"))).countGraphemes("न्न"))'
2

(ответ Python, показывающий3 неверно.)

Вы по-прежнему можете видеть две графемы при выделении текста или при удалении текста, начиная с правой стороны, с помощью клавиши Backspace:


ders отображается как один глиф, потому что это лигатура.Многие сценарии такие странные, не только Деванагари. Эта тема не имеет ничего общего с Unicode, однако, это задача средства визуализации шрифтов. Следовательно, ваш вопрос по поиску идентификатора в Unicode для глифа не имеет смысла - он имеет только один идентификатор внутрифайл шрифта.Например, в семействе шрифтов «Пользовательский интерфейс Noto Sans Devanagari» глиф можно найти по его идентификатору nanadeva.

...