如何使用Go删除给定UTF8编码字符串中的所有变音符号?例如,变换string "ž?žo"=> "zuzo".有标准的方法吗?
dyo*_*yoo 27
这是这些库的应用程序:
// Example derived from: http://blog.golang.org/normalization
package main
import (
    "fmt"
    "unicode"
    "golang.org/x/text/transform"
    "golang.org/x/text/unicode/norm"
)
func isMn(r rune) bool {
    return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks
}
func main() {
    t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
    result, _, _ := transform.String(t, "ž?žo")
    fmt.Println(result)
}
Pan*_*ris 18
transform.RemoveFunc 已弃用。
相反,您可以使用包Remove中的函数runes:
t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)\nresult, _, _ := transform.String(t, "\xc5\xbe\xc5\xaf\xc5\xbeo")\nfmt.Println(result)\n对现有答案进行一些扩展:
用于比较不同字符集的字符串的 Internet 标准称为“PRECIS”(应用程序协议中国际化字符串的准备、执行和比较),并记录在RFC7564 中。在golang.org/x/text/secure/precis 上还有一个 Go 实现。
没有一个标准配置文件可以满足您的要求,但是定义一个新的配置文件是相当直接的。您可能想要应用 Unicode 规范化形式 D(“D”代表“分解”,这意味着重音将被拆分并成为它们自己的组合字符),然后删除任何组合字符作为附加映射规则的一部分,然后重新组合与归一化规则。像这样的东西:
package main
import (
    "fmt"
    "unicode"
    "golang.org/x/text/secure/precis"
    "golang.org/x/text/transform"
    "golang.org/x/text/unicode/norm"
)
func main() {
    loosecompare := precis.NewIdentifier(
        precis.AdditionalMapping(func() transform.Transformer {
            return transform.Chain(norm.NFD, transform.RemoveFunc(func(r rune) bool {
                return unicode.Is(unicode.Mn, r)
            }))
        }),
        precis.Norm(norm.NFC), // This is the default; be explicit though.
    )
    p, _ := loosecompare.String("ž?žo")
    fmt.Println(p, loosecompare.Compare("ž?žo", "zuzo"))
    // Prints "zuzo true"
}
这使您可以在以后使用更多选项扩展比较(例如宽度映射、大小写映射等)
还值得注意的是,在比较这样的字符串时,删除重音几乎从来都不是您真正想要做的,但是,在不了解您的用例的情况下,我实际上无法对您的项目做出这样的断言。为了防止精确配置文件的扩散,最好尽可能使用现有配置文件之一。另请注意,没有努力优化示例配置文件。