gpt4 book ai didi

unicode - 如何检索 []rune 的第一个 “complete” 字符?

转载 作者:IT王子 更新时间:2023-10-29 02:05:38 25 4
gpt4 key购买 nike

我正在尝试编写一个函数

func Anonymize(name string) string

匿名化名称。以下是输入和输出对的一些示例,以便您了解它应该做什么:

Müller → M.
von der Linden → v. d. L.
Meyer-Schulze → M.-S.

这个函数应该可以处理由任意字符组成的名称。在实现这个功能时,我有以下问题:

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

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

最佳答案

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

func FirstGraphemeLen(str string) int {
re := regexp.MustCompile("\\PM\\pM*|.")
return len([]rune(re.FindAllString(str, -1)[0]))
}

参见 this example :

r := []rune{0x0041, 0x0308, 0x0066, 0x0041, 0x0308, 0x0067}
s := string(r)
fmt.Println(s, len(r), FirstGraphemeLen(s))

输出:

ÄfÄg 6 2

该字符串可能使用 6 个 rune ,但它的第一个字素使用 2 个。


OP FUZxxl使用另一种方法,使用 unicode.IsMark(r)

IsMark reports whether the rune is a mark character (category M).

来源(来自 FUZxxl 的 play.golang.org )包括:

// 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, '.')
/* ... */

关于unicode - 如何检索 []rune 的第一个 “complete” 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27628574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com