10

如何在字符串中拆分泰米尔语字符?

当我使用 时preg_match_all('/./u', $str, $results)
我得到字符“த”、“ம”、“ி”、“ழ”和“்”。

如何获得组合字符“த”、“மி”和“ழ்”?

4

2 回答 2

14

我认为您应该能够使用grapheme_extract函数来迭代组合字符(技术上称为“字素簇”)。

或者,如果您更喜欢正则表达式方法,我认为您可以使用以下方法:

preg_match_all('/\pL\pM*|./u', $str, $results)

其中\pL表示 Unicode“字母”,\pM表示 Unicode“标记”。

(免责声明:我没有测试过这两种方法。)

于 2012-01-10T03:55:23.843 回答
3

如果我正确理解你的问题,你有一个包含代码点的 unicode 字符串,你想把它转换成一个图形数组?

我正在开发一个开源 Python 库来为泰米尔语网站执行此类任务。

我有一段时间没有使用 PHP,所以我将发布逻辑。您可以查看amuthaa/TamilWord.py 文件的 split_letters() 函数中的代码。

正如 ruakh 所提到的,泰米尔语字素被构建为代码点。

  • 元音(உயிர்எழுத்து),Aytham(ஆய்த -ஃ)和所有组合((((உயிர்-மெய்))在'a''列中(அ -அ -ieக -ieக,ச,ச,ட,த,ப,ற,ற,ங,ங ஞ、ண、ந、ம、ன、ய、ர、ள、வ、ழ、ல)每个都使用一个代码点。

  • 每个辅音都由两个代码点组成:a 组合字母 + pulli。例如ப் = ப + ்</p>

  • 除 a 组合之外的每个组合也由两个代码点组成:a 组合字母 + 标记:例如 பி = ப் + ி, தை = த் + ை</p>

所以如果你的逻辑是这样的:

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
于 2013-01-25T16:48:10.893 回答