Я хочу знать, сколько юникода составляет один символ хинди

Я использовал питон:

for m in regex.findall(r"\X", 'ल्लील्ली', regex.UNICODE):
    for i in m:
        print(i, i.encode('unicode-escape'))
    print('--------')

результаты показывают, что ल्ली имеет 2 символа хинди:

ल b'\\u0932'
् b'\\u094d'
--------
ल b'\\u0932'
ी b'\\u0940'
--------

это неправильно, на самом деле ल्ली — это один иероглиф хинди. Как получить хинди-символ (например, ल्ली) по количеству композиций Unicode.

Короче говоря, я хочу разделить 'कृपयाल्ली' на 'कृ','प','या','ल्ली'


person GGS of Future    schedule 31.07.2020    source источник
comment
Ты не понимаешь. Короче говоря, я хочу разделить «कृपयाल्ली» на «कृ», «प», «या», «ल्ली».   -  person GGS of Future    schedule 31.07.2020
comment
Вы можете переработать тот же ответ. Просто держите вместе символы combining, а затем поместите ZWNJ между символами. Вы можете адаптировать его в зависимости от того, как вы хотите обращаться с вирамой. См. главу об индийском языке стандарта Unicode для получения дополнительной информации.   -  person Giacomo Catenazzi    schedule 31.07.2020


Ответы (2)


Я не совсем уверен, правильно ли это, поскольку я финский и плохо разбираюсь в хинди, но это объединит символы с любыми последующими символами Unicode Mark:

import unicodedata


def merge_compose(s: str):
    current = []
    for c in s:
        if current and not unicodedata.category(c).startswith("M"):
            yield current
            current = []
        current.append(c)
    if current:
        yield current


for group in merge_compose("कृपयाल्ली"):
    print(group, len(group), "->", "".join(group))

Выход

['क', 'ृ'] 2 -> कृ
['प'] 1 -> प
['य', 'ा'] 2 -> या
['ल', '्'] 2 -> ल्
['ल', 'ी'] 2 -> ली
person AKX    schedule 31.07.2020
comment
почти уверен, что это он, я пытался расшифровать результаты unicodedata.category, но так как я всегда работаю на английском языке, я понятия не имел - person juanpa.arrivillaga; 31.07.2020
comment
Проблема также запутана тем фактом, что если вы скопируете и вставите некоторые строки OP, например. консоль macOS, они модифицируются... - person AKX; 31.07.2020
comment
думаю, unicodedata.category() - правильный метод, но это не так, как вызывается. - person GGS of Future; 04.08.2020

Я нашел ответ в другом вопросе.

def splitclusters(s):
    """Generate the grapheme clusters for the string s. (Not the full
    Unicode text segmentation algorithm, but probably good enough for
    Devanagari.)

    """
    virama = u'\N{DEVANAGARI SIGN VIRAMA}'
    cluster = u''
    last = None
    for c in s:
        cat = unicodedata.category(c)[0]
        if cat == 'M' or cat == 'L' and last == virama:
            cluster += c
        else:
            if cluster:
                yield cluster
            cluster = c
        last = c
    if cluster:
        yield cluster

#print(list(splitclusters(word)))
person GGS of Future    schedule 31.07.2020
comment
Если вы найдете ответ в других местах, пожалуйста, добавьте также ссылку, где вы нашли ответ. Это очень полезно через несколько лет: большинство ответов устареют, и лишь немногие из них будут иметь обновленную версию, например. новые версии Python или новый пакет данных Unicode. Помните: мы являемся справочным сайтом, поэтому мы должны писать вопросы и ответы также для других людей (которые посмотрят на это в будущем) - person Giacomo Catenazzi; 31.07.2020
comment
@GiacomoCatenazzi Я думаю, что это ответ, на который ссылается OP - person snakecharmerb; 31.07.2020
comment
ссылка - person GGS of Future; 04.08.2020