如何使用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)
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)\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"
}
Run Code Online (Sandbox Code Playgroud)
这使您可以在以后使用更多选项扩展比较(例如宽度映射、大小写映射等)
还值得注意的是,在比较这样的字符串时,删除重音几乎从来都不是您真正想要做的,但是,在不了解您的用例的情况下,我实际上无法对您的项目做出这样的断言。为了防止精确配置文件的扩散,最好尽可能使用现有配置文件之一。另请注意,没有努力优化示例配置文件。
归档时间: |
|
查看次数: |
4613 次 |
最近记录: |