【问题标题】:Conversion from runes / int8 array to string and vice versa从 runes / int8 数组到字符串的转换,反之亦然
【发布时间】:2018-02-11 17:22:10
【问题描述】:

我正在将一个库从 Java 移植到 Go。这个库传递所有参数并作为字符串返回,我必须在后续步骤中保持这种方式。我注意到,当我将 rune/int8 数组转换为字符串并转换回 rune/int8 数组时,我得到了不同的值。我相信这是由 Unicode 字符引起的。有没有办法获得相同的值?

package main

import "fmt"

func main() {  

    runes := make([]rune,3)
    runes[0] = 97
    runes[1] = -22
    runes[2] = 99

    s := string(runes)

    fmt.Println(runes)  
    for _,r := range(s) {
        fmt.Println(r)
    }
}

输出:

[97 -22 99]
97
65533
99

【问题讨论】:

  • -22 不是有效符文
  • 嗨@JimB,如果我使用 int8 我会得到相同的结果。关键是如何将负值存储在字符串上然后将其取回。
  • 字节是用java签名的,所以当你打印一个单独的字节时,你可以得到[-128, 127]范围内的东西。 Go 想要 uint8,在你的情况下是 234
  • 嗨 @Marc 我在 godocs link 上读到,符文是 int32,所以范围没问题。我不明白为什么我会得到不同的值。如果在示例代码中我们将 rune 更改为 int32,结果将是相同的
  • 好的,范围没问题,但是当你试图说出字符值234时,你仍然给它一个负数。

标签: arrays go


【解决方案1】:

The Go Programming Language Specification

Conversions

字符串类型的转换

将有符号或无符号整数值转换为字符串类型会产生 包含整数的 UTF-8 表示形式的字符串。价值观 超出有效 Unicode 代码点范围的转换为 "\uFFFD"。

将一片符文转换为字符串类型会产生一个字符串 各个符文值的串联转换为字符串。


类型 byte 在 Go 中是类型 uint8 的别名。

类型rune,一个Unicode代码点(24位无符号整数),是int32的别名。

Go 将 Unicode 代码点 (runes) 编码为 UTF-8 编码的strings。

以你的为例,

package main

import (
    "fmt"
    "unicode"
)

func main() {

    // Unicode code points are 24-bit unsigned integers
    runes := make([]rune, 3)
    runes[0] = 97
    runes[1] = -22 // invalid Unicode code point
    runes[2] = 99
    fmt.Println(runes)

    // Encode Unicode code points as UTF-8
    // Invalid code points converted to Unicode replacement character (U+FFFD)
    s := string(runes)
    fmt.Println(s)

    // Decode UTF-8 as Unicode code points
    for _, r := range s {
        fmt.Println(r, string(r), r == unicode.ReplacementChar)
    }
}

游乐场:https://play.golang.org/p/AZUBd2iZp1F

输出:

[97 -22 99]
a�c
97 a false
65533 � true
99 c false

参考资料:

The Go Programming Language Specification

The Go Blog: Strings, bytes, runes and characters in Go

The Unicode Consortium

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多