2012-01-10 12 views

Odpowiedz

11

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ść.)

+0

Testowałem to i poprawnie pasuje do znaków. – Danack

+0

@ Danack57: Fajnie, dziękuję bardzo. :-) – ruakh

+0

dziękuję. To dobrze działa. – priyacst

2

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 
Powiązane problemy