Как разделить символы тамильского языка в строке?
Когда я использую preg_match_all('/./u', $str, $results)
,
я получаю символы "த", "ம", "ி", "ழ" и "்".
Как мне получить комбинированные символы «த», «மி» и «ழ்»?
Как разделить символы тамильского языка в строке?
Когда я использую preg_match_all('/./u', $str, $results)
,
я получаю символы "த", "ம", "ி", "ழ" и "்".
Как мне получить комбинированные символы «த», «மி» и «ழ்»?
Я думаю, вы должны иметь возможность использовать функцию grapheme_extract
для перебора комбинированных символов (которые технически называемые «графемными кластерами»).
В качестве альтернативы, если вы предпочитаете подход с регулярными выражениями, я думаю, вы можете использовать это:
preg_match_all('/\pL\pM*|./u', $str, $results)
где \pL
означает «букву» Юникода, а \pM
означает «метку» Юникода.
(Отказ от ответственности: я не тестировал ни один из этих подходов.)
если я правильно понял ваш вопрос, у вас есть строка юникода, содержащая кодовые точки, и вы хотите преобразовать ее в массив графем?
Я работаю над разработкой библиотеки 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