【问题标题】:Why is Go adding bytes to my string?为什么 Go 在我的字符串中添加字节?
【发布时间】:2015-09-19 20:41:59
【问题描述】:

当我在 0x80 或以上的位置向字符串添加单个字节时,golang 将在我的字节前添加 0xc2。 我认为这与utf8 runes 有关。无论哪种方式,我如何将 0x80 添加到字符串的末尾?

例子:

var s string = ""
len(s) // this will be 0
s += string(0x80)
len(s) // this will be 2, string is now bytes 0xc2 0x80

【问题讨论】:

    标签: string utf-8 go bytearray


    【解决方案1】:

    来自specification

    将有符号或无符号整数值转换为字符串类型会生成一个包含整数的 UTF-8 表示形式的字符串。

    表达式 string(0x80) 计算为 UTF-8 表示为 0x80 的字符串,而不是包含单字节 0x80 的字符串。 0x80 的 UTF-8 表示为 0xc2 0x80。

    使用 \x 十六进制转义符指定字符串中的字节 0x80:

     s += "\x80"
    

    您可以使用 string([]byte) 转换从任意字节序列创建字符串。

     s += string([]byte{0x80})
    

    【讨论】:

    • 但是如果我不知道字节是什么,我怎么能只添加纯字节呢?
    • b := byte(0x80); s += string([]byte{b})
    • 最好不要将非可变类型 (string) 用于可变的东西。如果您要向某事物添加字节,您可能希望该事物成为[]byte*bytes.Buffer 或类似的东西。特别是如果您经常使用+=,因为每次它可能需要分配和重新复制字符串。
    【解决方案2】:

    如果我使用string(0x80) 转换字节,我还没有找到避免添加该字符的方法。但是,我确实发现,如果我将整个字符串更改为字节切片,然后添加字节,然后切换回字符串,我可以在字符串中得到正确的字节顺序。

    例子:

    bytearray := []byte(some_string)
    bytearray = append(bytearray, 0x80)
    some_string = string(bytearray)
    

    有点愚蠢的解决方法,如果有人找到更好的方法,请发布。

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2020-04-30
      相关资源
      最近更新 更多