Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go:从字符串中删除重音符号_Go - Fatal编程技术网

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

Go:从字符串中删除重音符号,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 {

我是新手,我正在尝试实现一个函数,将重音字符转换为非重音字符。我试图遵循博客中给出的例子(参见标题“表演魔术”)

我试图从中得出以下结论:

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

它一点也不起作用,老实说,我不知道它到底意味着什么。有什么想法吗?

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

 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))
请注意,Go 1.5(2015年8月)或Go 1.6(2016年第1季度)可能会引入一个新的符文包,带有转换操作

这包括(在)一个
符文。删除
函数,它将帮助
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
}

这是。

请注意,如果您只想处理现有的
[]字节
字符串
,如果有任何方式“流式”数据(例如,在从文件或网络读/写时转换数据),则首选
transform.NewReader
(或
transform.NewWriter
),转换包还提供和。像这样直接调用转换方法不是一个好主意!您得到的字节比预期的少的原因是您没有从读取器读取所有内容。对现有代码最简单的“修复”是用io.ReadFull(r,b)
替换read调用,但这仍然会对结束长度进行假设,有更好的方法可以做到这一点。