我是Go的新手,我正在尝试实现一个函数,将重音字符转换为非重音符号.我正在尝试按照此博客中给出的示例(请参阅"执行魔术"标题).
我试图从中收集到的是:
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)
}
Run Code Online (Sandbox Code Playgroud)
它丝毫没有用,我老实说也不知道它意味着什么.有任何想法吗?
Von*_*onC 11
请注意,Go 1.5(2015年8月)或Go 1.6(2016年第1季度)可能会引入一个带有变换操作的新符文包.
这包括(in 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
}
Run Code Online (Sandbox Code Playgroud)
r 应该是 或 type io.Reader,并且你不能像那样打印 r 。首先,您需要将内容读取到字节片中:
var ( \n s = "Your \xc5\x9atring"\n b = make([]byte, len(s))\n\n r io.Reader = strings.NewReader(s)\n ) \n t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)\n r = transform.NewReader(r, t)\n r.Read(b)\n fmt.Println(string(b))\nRun Code Online (Sandbox Code Playgroud)\n\n这可行,但由于某种原因它返回给我“Your Stri”,比需要的少两个字节。
\n\n这是实际满足您需要的版本,但我仍然不确定为什么博客中的示例工作得如此奇怪。
\n\ns := "Yo\xc3\xb9r \xc5\x9atring"\nb := make([]byte, len(s))\n\nt := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)\n_, _, e := t.Transform(b, []byte(s), true)\nif e != nil { panic(e) }\n\nfmt.Println(string(b))\nRun Code Online (Sandbox Code Playgroud)\n