Unicode 如何检索第一个“;完成”;[]符文的字符?

Unicode 如何检索第一个“;完成”;[]符文的字符?,unicode,go,rune,Unicode,Go,Rune,我正在尝试写一个函数 func Anonymize(name string) string 匿名的名字。下面是一些输入和输出对的示例,让您了解它应该做什么: Müller → M. von der Linden → v. d. L. Meyer-Schulze → M.-S. 此函数应该用于由任意字符组成的名称。在执行此功能时,我有以下问题: 给定一个[]符文或字符串,我如何计算得到一个完整的字符需要多少符文,在这个意义上,与该字符对应的所有修饰符和组合重音也都是完整的。例如,如果输入是[]

我正在尝试写一个函数

func Anonymize(name string) string
匿名的名字。下面是一些输入和输出对的示例,让您了解它应该做什么:

Müller → M.
von der Linden → v. d. L.
Meyer-Schulze → M.-S.
此函数应该用于由任意字符组成的名称。在执行此功能时,我有以下问题:

给定一个
[]符文
字符串
,我如何计算得到一个完整的字符需要多少符文,在这个意义上,与该字符对应的所有修饰符和组合重音也都是完整的。例如,如果输入是
[]符文{0x0041,0x0308,0x0066,0x0067}
(对应于字符串ÄBC,其中Ä表示为A和组合diaresis的组合),则函数应返回2,因为前两个符文产生第一个字符,即Ä。如果我只取第一个符文,我会得到一个不正确的


我需要这个问题的答案,因为我想匿名的名字可能以重音字符开头,我不想删除重音。

您可以尝试以下功能(灵感来自“”):

见:

输出:

ÄfÄg 6 2
该字符串可能使用6个符文,但它的第一个字位使用2个符文


他们使用了另一种方法,使用

IsMark
报告符文是否为标记字符(M类)

来源(来自FUZxxl)包括:

// take one character including all modifiers from the last name
r, _, err := ln.ReadRune()
if err != nil {
    /* ... */
}

aln = append(aln, r)

for {
    r, _, err = ln.ReadRune()
    if err != nil {
        goto done
    }

    if !unicode.IsMark(r) {
        break
    }

    aln = append(aln, r)
}

aln = append(aln, '.')
/* ... */

这很有帮助,尽管我在实际代码中没有使用正则表达式。事实上,这是一个很好的例子。我已将您的解决方案包含在答案中,以提高可见性。
ÄfÄg 6 2
// take one character including all modifiers from the last name
r, _, err := ln.ReadRune()
if err != nil {
    /* ... */
}

aln = append(aln, r)

for {
    r, _, err = ln.ReadRune()
    if err != nil {
        goto done
    }

    if !unicode.IsMark(r) {
        break
    }

    aln = append(aln, r)
}

aln = append(aln, '.')
/* ... */