Как разбить тамильские символы в строке в PHP

Как разделить символы тамильского языка в строке?

Когда я использую preg_match_all('/./u', $str, $results),
я получаю символы "த", "ம", "ி", "ழ" и "்".

Как мне получить комбинированные символы «த», «மி» и «ழ்»?


person priyacst    schedule 10.01.2012    source источник


Ответы (2)


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

В качестве альтернативы, если вы предпочитаете подход с регулярными выражениями, я думаю, вы можете использовать это:

preg_match_all('/\pL\pM*|./u', $str, $results)

где \pL означает «букву» Юникода, а \pM означает «метку» Юникода.

(Отказ от ответственности: я не тестировал ни один из этих подходов.)

person ruakh    schedule 10.01.2012
comment
Пожалуйста, примите этот ответ, если он помог вам решить вашу проблему. Это даст четкое указание на то, что на этот вопрос был дан удовлетворительный ответ, предоставит будущим посетителям индикатор того, какой ответ сработал (если таковой имеется), и даст немного дополнительной репутации тому, у кого есть ответ, в качестве стимула продолжать отвечать на вопросы. Спасибо! - person sarnold; 14.01.2012

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

Я работаю над разработкой библиотеки Python с открытым исходным кодом для выполнения подобных задач для веб-сайта на тамильском языке.

Я давно не использовал PHP, поэтому опубликую логику. Вы можете взглянуть на код в разделе split_letters файла amuthaa/TamilWord.py. () функция.

Как упоминал Руах, тамильские графемы построены как кодовые точки.

  • Гласные (உயிர் எழுத்து எழுத்து), aytham (ஆய்த எழுத்து - ஃ) и все комбинации (((உயிர் -மெய் எழுத்து) в столбце 'a' (அ வரி - то есть க, ச, ட, த, ப, ற, ங, ஞ, ண, ந, ம, ன, ய, ர, ள, வ, ழ, ல) используют одну кодовую точку.

  • Каждый согласный состоит из двух кодовых точек: буква а + пулли. Например. ப் = ப + ்

  • Каждая комбинация, кроме а-комбинаций, также состоит из двух кодовых точек: буква а-комбинации + маркировка: например. பி = ப் + ி, தை = த் + ை

Итак, если ваша логика будет примерно такой:

initialize an empty array

for each codepoint in word:

    if the codepoint is a vowel, a-combination or aytham, it is also its grapheme, so add it to the array

    otherwise, the codepoint is a marking such as the pulli (i.e. ்) or one of the combination extensions (e.g.  ி or  ை), so append it to the end of the last element of the array

Это, конечно, предполагает, что ваша строка правильно сформирована и у вас нет таких вещей, как две маркировки подряд.

Вот код Python, если он окажется вам полезен. Если вы хотите помочь нам перенести это на PHP, пожалуйста, дайте мне знать:

@staticmethod
def split_letters(word=u''):
    """ Returns the graphemes (i.e. the Tamil characters) in a given word as a list """

    # ensure that the word is a valid word
    TamilWord.validate(word)

    # list (which will be returned to user)
    letters = []

    # a tuple of all combination endings and of all அ combinations
    combination_endings = TamilLetter.get_combination_endings()
    a_combinations = TamilLetter.get_combination_column(u'அ').values()

    # loop through each codepoint in the input string
    for codepoint in word:

        # if codepoint is an அ combination, a vowel, aytham or a space,
        # add it to the list
        if codepoint in a_combinations or \
            TamilLetter.is_whitespace(codepoint) or \
            TamilLetter.is_vowel(codepoint) or \
            TamilLetter.is_aytham(codepoint):

            letters.append(codepoint)

        # if codepoint is a combination ending or a pulli ('்'), add it
        # to the end of the previously-added codepoint
        elif codepoint in combination_endings or \
            codepoint == TamilLetter.get_pulli():

            # ensure that at least one character already exists
            if len(letters) > 0:
                letters[-1] = letters[-1] + codepoint

            # otherwise raise an Error. However, validate_word()
            # should catch this
            else:
                raise ValueError("""%s cannot be first character of a word""" % (codepoint))

    return letters
person Ashwin Balamohan    schedule 25.01.2013