Go:从字符串中删除重音符号

Ala*_*air 8 go

我是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)

这是仍在虽然(2015年4月)审议.


Ain*_*r-G 4

r 应该是 或 type io.Reader,并且你不能像那样打印 r 。首先,您需要将内容读取到字节片中:

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

这可行,但由于某种原因它返回给我“Your Stri”,比需要的少两个字节。

\n\n

这是实际满足您需要的版本,但我仍然不确定为什么博客中的示例工作得如此奇怪。

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