Как разделить тамильские символы в строке в PHP - PullRequest
10 голосов
/ 10 января 2012

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

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

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

Ответы [ 2 ]

13 голосов
/ 10 января 2012

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

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

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

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

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

2 голосов
/ 25 января 2013

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

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

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

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

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

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

  • Каждая комбинация, отличная от a-комбинаций, также состоит из двух кодовых точек: буквы 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
...