Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从符文/int8数组转换为字符串,反之亦然_Arrays_Go - Fatal编程技术网

Arrays 从符文/int8数组转换为字符串,反之亦然

Arrays 从符文/int8数组转换为字符串,反之亦然,arrays,go,Arrays,Go,我正在从Java向Go移植一个库。这个库以字符串的形式传递所有参数和返回,由于后续步骤,我必须保持这种方式。我注意到,当我将符文/int8数组转换为字符串,并将其转换回符文/int8数组时,我得到了不同的值。我相信这是由Unicode字符引起的。有没有办法获得相同的值 package main import "fmt" func main() { runes := make([]rune,3) runes[0] = 97 runes[1] = -22 r

我正在从Java向Go移植一个库。这个库以字符串的形式传递所有参数和返回,由于后续步骤,我必须保持这种方式。我注意到,当我将符文/int8数组转换为字符串,并将其转换回符文/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
[97 -22 99]
a�c
97 a false
65533 � true
99 c false

与字符串类型之间的转换

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

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


Go中的Type
byte
是Type
uint8
的别名

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

Go将Unicode代码点(
rune
s)编码为UTF-8编码的
string
s

以你为例,

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)
    }
}
游乐场:

输出:

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

参考资料:


-22不是有效的runeHi@JimB,如果我使用int8,我会得到相同的结果。关键是如何在字符串上存储负值并将其取回。字节是用java签名的,因此当您打印单个字节时,可以获得范围
[-128127]
内的内容。Go想要uint8,在你的例子中是
234
。我不明白为什么我会得到不同的值。如果在示例代码中,我们将符文更改为int32,结果将是sameok,范围很好,但当您试图说出字符值
234
时,仍然给它一个负数。您好@peterSO谢谢您的回答。我将使用int8数组而不是字符串重构库。@安德烈·安德拉德:Java字符串编码为UTF-16(uint16)。“字符串表示UTF-16格式的字符串。”