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

时间:2018-02-10 17:13:17

标签: arrays go

我正在将一个库从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

1 个答案:

答案 0 :(得分:3)

  

The Go Programming Language Specification

     

Conversions

     

转换为字符串类型

     

将有符号或无符号整数值转换为字符串类型   包含整数的UTF-8表示的字符串。值   在有效的Unicode代码点范围之外转换为   " \ uFFFD"

     

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

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

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

将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)
    }
}

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