我需要在Go中比较字符串。问题是:我想将重音单词(café(与其非重音形式(cafe(进行比较。我要做的第一件事是将带重音的string
转换为非重音形式:
您可以在此处运行代码:https://play.golang.org/p/-eRUQeujZET
但每次我在字符串中进行这种转换时,它最终都会添加更多符文。上面的例子打印:
bytes: [99 97 102 101 0] string: cafe
由于我需要将此过程返回的字符串与其最初没有"é"的对应字符串进行比较,因此我需要从[]byte
中删除最后一个rune
(0(。
在运行了一些测试之后,我发现最后的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/
这是您的自定义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