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

can I remove the trailing zeros in a strings representation ([]byte) to compare strings?

我需要在 Go 中比较字符串。 问题是:我想比较重音词 (café) 和它的非重音形式 (cafe)。 我做的第一件事是将重音 string 转换为非重音形式:

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

但每次我在字符串中进行这种转换时,它都会在最后添加更多 运行es。上面的例子打印:

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

因为我需要比较从这个过程返回的字符串和它的对应字符串,首先没有'é',我需要从 [=13= 中删除最后一个 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(),它也是 return 写入目标的字节数。但是你不使用那个 return 值。

最简单的方法是存储 nDst return 值,并对目标切片进行切片,因为它包含其中“有用”字节的数量(超过 nDst 的字节将保持前面 make() 电话交给您的 0:

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

进行此更改后,returned 切片将仅包含有用的字节,不带尾随零。

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

2009/11/10 23:00:00 bytes: [99 97 102 101] string: cafe