Jak podzielić znaki tamilskie na ciąg znaków?Jak podzielić znaki tamilskie na łańcuch znaków w PHP
Gdy używam preg_match_all('/./u', $str, $results)
,
dostaję znaki "த", "ம", "ி", "ழ" i "்".
Jak uzyskać kombinację znaków "த", "மி" i "ழ்"?
Jak podzielić znaki tamilskie na ciąg znaków?Jak podzielić znaki tamilskie na łańcuch znaków w PHP
Gdy używam preg_match_all('/./u', $str, $results)
,
dostaję znaki "த", "ம", "ி", "ழ" i "்".
Jak uzyskać kombinację znaków "த", "மி" i "ழ்"?
Myślę, że powinieneś być w stanie użyć the grapheme_extract
function do iteracji nad połączonymi znakami (które są technicznie nazywane "klastrami grafem").
Ewentualnie, jeśli wolisz podejście regex, myślę, że można to wykorzystać:
preg_match_all('/\pL\pM*|./u', $str, $results)
gdzie \pL
oznacza Unicode "list", a \pM
oznacza Unicode "znak".
(Zastrzeżenie: Nie testowałem żadnej z tych podejść.)
jeśli dobrze rozumiem pytanie, masz ciąg Unicode zawierający codepoints, a chcesz przekonwertować to do tablicy graphames?
Pracuję nad stworzeniem biblioteki Pythona o otwartym kodzie źródłowym do wykonywania takich zadań dla Tamil Language website.
Nie używałem PHP od jakiegoś czasu, więc opublikuję logikę. Możesz rzucić okiem na kod w amuthaa/TamilWord.py file's split_letters() function.
Jak wspomniano w ruach, tamtejsze grafemy są konstruowane jako współrzędne.
W samogłoski (உயிர் எழுத்து) aytham (ஆய்த எழுத்து - ஃ) i wszystkie kombinacje ((உயிர்-மெய் எழுத்து), w 'A' kolumny (அ வரி - tj க, ச, ட, த , ப, ற, ங, ஞ, ண, ந, ம, ன, ய, ர, ள, வ, ழ, ல), z których każdy korzysta z jednego punktu kodowania:
Każda spółgłoska składa się z dwóch punktów kodowych: a-kombinacja liter + pulli, np. ப் = ப + ்
Każda kombinacja inna niż kombinacje to als O składa się z dwóch codepoints: litera A-kombinacja + oznakowanie: np பி = ப் + ி, தை = த் + ை
Więc jeśli logika będzie coś takiego:
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
To oczywiście zakłada, że twoja struna jest dobrze uformowana i nie masz takich rzeczy jak dwa oznaczenia z rzędu.
Oto kod Pythona, jeśli uznasz to za pomocne. Jeśli chcesz nam pomóc w przeniesieniu tego do PHP, daj nam znać również:
@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
Testowałem to i poprawnie pasuje do znaków. – Danack
@ Danack57: Fajnie, dziękuję bardzo. :-) – ruakh
dziękuję. To dobrze działa. – priyacst