golang rune是utf-8吗
时间: 2024-01-20 08:04:39 浏览: 176
在 Golang 中,rune 表示 Unicode 码点,而不是特定的编码方式(比如 UTF-8)。Unicode 定义了每个字符的唯一码点,而 UTF-8 是一种编码方式,用于将 Unicode 码点编码成字节序列。在 Golang 中,使用 string 类型表示字符串,而每个字符串都是由一系列 Unicode 码点组成的,因此 rune 类型通常用于表示字符串中的单个字符。当我们在 Golang 中对字符串进行操作时,Golang 会自动将字符串转换为 Unicode 码点序列进行操作,而不需要我们显式地进行编码和解码。
相关问题
golang实现unicode转换utf-8
示例代码:
```go
package main
import (
"fmt"
)
func main() {
var r rune = '世'
fmt.Printf("%c\n", r)
fmt.Println("unicode:", r)
bytes := make([]byte, 4)
n := utf8.EncodeRune(bytes, r)
fmt.Println("utf-8:", bytes[:n])
}
```
输出:
```
世
unicode: 19990
utf-8: [228 184 150]
```
解释:首先定义了一个Unicode字符(rune类型):'世',输出它的字符形式,unicode码值,然后使用`utf8.EncodeRune`函数将该字符转换为UTF-8编码。需要注意的是,UTF-8编码有不同长度的字节表示,因此需要指定一个足够大的字节切片用于存储转换后的数据,并记录转换后的字节数,避免使用过多的字节。
golang实现base转换为utf-8
package main
import (
"fmt"
"strings"
)
var base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
func baseToBinary(b byte) string {
idx := strings.IndexByte(base, b)
if idx == -1 {
return ""
}
return fmt.Sprintf("%06b", idx)
}
func binaryToUTF8(b string) string {
utf8 := ""
for len(b) > 0 {
r, size := utf8Decode(b)
utf8 += string(r)
b = b[size:]
}
return utf8
}
func utf8Decode(b string) (r rune, size int) {
if len(b) == 0 {
return 0, 0
}
firstByte := b[0]
if firstByte < 0x80 {
return rune(firstByte), 1
}
masks := []byte{0x7f, 0x3f, 0x1f, 0x0f}
mask := masks[(firstByte>>3)&0x03]
r = rune(firstByte & mask)
size = 2
if firstByte&0xe0 == 0xc0 {
mask = masks[0]
r |= rune((b[1] & mask) << 6)
} else if firstByte&0xf0 == 0xe0 {
mask = masks[1]
r |= rune((b[1] & mask) << 6)
r |= rune(b[2] & 0x3f)
size = 3
} else if firstByte&0xf8 == 0xf0 {
mask = masks[2]
r |= rune((b[1] & mask) << 6)
r |= rune((b[2] & 0x3f) << 6)
r |= rune(b[3] & 0x3f)
size = 4
}
return r, size
}
func baseToUTF8(s string) (string, error) {
if len(s)%4 != 0 {
return "", fmt.Errorf("invalid base string")
}
var binary string
for i := 0; i < len(s); i += 4 {
block := s[i : i+4]
binary += baseToBinary(block[0])
binary += baseToBinary(block[1])
binary += baseToBinary(block[2])
binary += baseToBinary(block[3])
}
return binaryToUTF8(binary), nil
}
func main() {
baseString := "SGVsbG8gV29ybGQh"
utf8String, err := baseToUTF8(baseString)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(utf8String) // Output: "Hello World!"
}
阅读全文