我是Go的新手,我正在尝试实现一个函数,将重音字符转换为非重音字符。我试图按照this博客中给出的示例(参见“表演魔术”标题)。
我试图从中收集的是:
package main
import (
"fmt"
"unicode"
"bytes"
"code.google.com/p/go.text/transform"
"code.google.com/p/go.text/unicode/norm"
)
func isMn (r rune) bool {
return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks
}
func main() {
r := bytes.NewBufferString("Your Śtring")
t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
r = transform.NewReader(r, t)
fmt.Println(r)
}
它没有丝毫的作用,老实说,我不知道这意味着什么。有什么想法吗?
答案 0 :(得分:10)
请注意,Go 1.5(2015年8月)或Go 1.6(2016年第1季度)可能会引入一个新的符文包,其中包含转换操作。
其中包括(runes/example_test.go
)runes.Remove
个résumé
函数,该函数有助于将resume
转换为func ExampleRemove() {
t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
s, _, _ := transform.String(t, "résumé")
fmt.Println(s)
// Output:
// resume
}
:
{{1}}
答案 1 :(得分:4)
应该是或者输入io.Reader
,你不能这样打印。首先,您需要将内容读取到字节切片:
var (
s = "Your Śtring"
b = make([]byte, len(s))
r io.Reader = strings.NewReader(s)
)
t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
r = transform.NewReader(r, t)
r.Read(b)
fmt.Println(string(b))
这有效,但由于某种原因,它会让我回复你的Stri",比所需要的少两个字节。
这是实际执行您需要的版本,但我仍然不确定为什么博客中的示例如此奇怪。
s := "Yoùr Śtring"
b := make([]byte, len(s))
t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
_, _, e := t.Transform(b, []byte(s), true)
if e != nil { panic(e) }
fmt.Println(string(b))