使用Go删除变音符号

eeq*_*eeq 19 unicode utf-8 go

如何使用Go删除给定UTF8编码字符串中的所有变音符号?例如,变换string "ž?žo"=> "zuzo".有标准的方法吗?

dyo*_*yoo 27

您可以使用Go中的文本规范化中描述的库.

这是这些库的应用程序:

// 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)
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但由于 `transform.RemoveFunc` 已被弃用,所以更喜欢使用 `runes.Remove(runes.In(unicode.Mn))` 代替。 (7认同)
  • 这仅适用于具有unicode分解的字符.例如,字符Ł(L with stroke)不会改变(因此"AŁA"将转换为"AŁA"),即使直觉上它应该被翻译成"L"(所以"AŁA"=>"ALA"). (6认同)

Pan*_*ris 18

transform.RemoveFunc 已弃用

\n

相反,您可以使用包Remove中的函数runes

\n
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
Run Code Online (Sandbox Code Playgroud)\n


Sam*_*ted 7

对现有答案进行一些扩展:

用于比较不同字符集的字符串的 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"
}
Run Code Online (Sandbox Code Playgroud)

这使您可以在以后使用更多选项扩展比较(例如宽度映射、大小写映射等)

还值得注意的是,在比较这样的字符串时,删除重音几乎从来都不是您真正想要做的,但是,在不了解您的用例的情况下,我实际上无法对您的项目做出这样的断言。为了防止精确配置文件的扩散,最好尽可能使用现有配置文件之一。另请注意,没有努力优化示例配置文件。