为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕码人2483693 2022-06-21 16:37:56
我需要比较 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/stringshttps://blog.golang.org/normalizationhttps://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/
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

这是您的自定义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


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号