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

时间:2014-07-05 16:16:36

标签: go

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

它没有丝毫的作用,老实说,我不知道这意味着什么。有什么想法吗?

2 个答案:

答案 0 :(得分:10)

请注意,Go 1.5(2015年8月)或Go 1.6(2016年第1季度)可能会引入一个新的符文包,其中包含转换操作。

其中包括(runes/example_test.gorunes.Removeré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}}

这是still being reviewed though (April 2015)

答案 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))