nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn đã có một chuỗi unicode chứa codepoints, và bạn muốn chuyển đổi này vào một mảng của graphames?
Tôi đang nghiên cứu phát triển thư viện Python nguồn mở để thực hiện các tác vụ như thế này cho một số Tamil Language website.
Tôi đã không sử dụng PHP trong một thời gian, vì vậy tôi sẽ đăng logic. Bạn có thể xem mã trong số amuthaa/TamilWord.py file's split_letters() function.
Như ruakh đã đề cập, biểu đồ Tamil được xây dựng dưới dạng điểm mã.
Các nguyên âm (உயிர் எழுத்து), aytham (ஆய்த எழுத்து - ஃ) và tất cả các kết hợp ((உயிர்-மெய் எழுத்து) trong 'a' cột (அ வரி - tức là க, ச, ட, த , ப, ற, ங, ஞ, ண, ந, ம, ன, ய, ர, ள, வ, ழ, ல), mỗi người sử dụng một điểm duy nhất.
Mỗi phụ âm được tạo thành từ hai điểm sau: một chữ cái kết hợp + pulli Ví dụ: ப் = ப + ்
Mọi kết hợp khác với kết hợp là als o tạo thành từ hai codepoints: bức thư một sự kết hợp + a đánh dấu: ví dụ பி = ப் + ி, தை = த் + ை
Vì vậy, nếu logic của bạn sẽ là một cái gì đó như thế này:
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
Điều này tất nhiên giả định rằng chuỗi của bạn được hình thành tốt và bạn không có những thứ như hai dấu trong một hàng.
Đây là mã Python, trong trường hợp bạn thấy nó hữu ích. Nếu bạn muốn giúp chúng tôi chuyển mã này sang PHP, vui lòng cho tôi biết:
@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
Nguồn
2013-01-25 16:48:10
Tôi đã thử nghiệm và nó khớp chính xác với các ký tự. – Danack
@ Danack57: Tuyệt vời, cảm ơn bạn rất nhiều. :-) – ruakh
cảm ơn bạn. Nó hoạt động tốt. – priyacst