我可以删除字符串表示([]字节)中的尾随零来比较字符串吗



我需要在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

最新更新