если я правильно понимаю ваш вопрос, у вас есть строка в кодировке Юникод, содержащая кодовые точки, и вы хотите преобразовать ее в массив графам?
Я работаю над созданием библиотеки 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