-1

我需要比较 Go 中的字符串。问题是:我想将带重音的单词 (cafe) 与其非重音形式 (cafe) 进行比较。我要做的第一件事就是将我的重音转换string为非重音形式:

你可以在这里运行代码:https: //play.golang.org/p/-eRUQeujZET

但是每次我在一个字符串中进行这种转换时,它最终都会添加更多的符文。上面的示例打印:

bytes: [99 97 102 101 0] string: cafe

由于我需要将此进程返回的字符串与首先不带“é”的对应字符串进行比较,因此我需要rune[]byte.

在运行了一些测试之后,我发现最后一个 0(有时它添加了多个)不会改变字符串表示。

我错过了什么吗?我可以只删除末尾的所有零[]byte吗?

这是我删除 0 并比较字符串的代码:

https://play.golang.org/p/HoueAGI4uUx

由于我们不能在这个领域单独工作,因此我阅读了以下文章以了解我现在所处的位置:

https://blog.golang.org/strings

https://blog.golang.org/normalization

https://unicode.org/reports/tr15/

https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

4

1 回答 1

2

这是您的自定义Transform()函数:

func Transform(s string) ([]byte, error) {
    var t transform.Transformer
    t = transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
    dst := make([]byte, len(s))
    _, _, err := t.Transform(dst, []byte(s), true)
    if err != nil {
        return nil, err
    }
    return dst, nil
}

在其中,您正在使用Transformer.Transform()它还返回写入目标的字节数。但是您不使用该返回值。

最简单的方法是存储nDst返回值,并对目标切片进行切片,因为它保存了其中“有用”字节的数量(超出的字节nDst将保留0为前面make()调用所传递给您的):

nDst, _, err := t.Transform(dst, []byte(s), true)
if err != nil {
    return nil, err
}
return dst[:nDst], nil

通过此更改,返回的切片将仅包含有用的字节而没有尾随零。

输出将是(在Go Playground上尝试):

2009/11/10 23:00:00 bytes: [99 97 102 101] string: cafe
于 2020-08-07T21:09:59.663 回答