Golang中如何将Unicode字符转换为UTF-8

Golang中如何将Unicode字符转换为UTF-8 在这段代码中 https://play.golang.org/p/UGxgwfA3uJf

package main

import (
	"encoding/hex"
	"fmt"
)

func main() {
	decodeHex("53D6D7")
	decodeHex("6CV4GC")
}

func decodeHex(s string) {
	b, err := hex.DecodeString(s)
	if err != nil {
		fmt.Printf("error: %v\n", err)
		return
	}
	fmt.Println(b)
}

//Output
[83 214 215]
error: encoding/hex: invalid byte: U+0056 'V'

有没有一种快捷方法可以将Unicode字符U+0056 'V’转换为UTF-8,而不需要通过charset.DetermineEncoding


更多关于Golang中如何将Unicode字符转换为UTF-8的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你说得对!不是这样的,我只是遇到了一些错误的哈希值。

更多关于Golang中如何将Unicode字符转换为UTF-8的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我认为,您误用了 hex.DecodeString

DecodeString 期望 src 仅包含十六进制字符,并且 src 应具有偶数长度。如果输入格式错误,DecodeString 将返回一个包含错误发生前已解码字节的字符串。

在您的示例中,V 如何能算作十六进制字符呢?

在Go语言中,将Unicode字符转换为UTF-8编码非常简单,因为Go的字符串默认就是UTF-8编码的。对于单个Unicode字符,可以使用[]byte()转换或utf8.EncodeRune函数。

以下是几种实现方式:

方法1:使用[]byte()转换

package main

import (
	"fmt"
)

func main() {
	// Unicode字符U+0056 'V'
	char := 'V'
	
	// 转换为UTF-8字节序列
	utf8Bytes := []byte(string(char))
	fmt.Printf("Unicode字符: %c\n", char)
	fmt.Printf("UTF-8字节: %v\n", utf8Bytes)
	fmt.Printf("十六进制: %x\n", utf8Bytes)
}

输出:

Unicode字符: V
UTF-8字节: [86]
十六进制: 56

方法2:使用utf8.EncodeRune

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	// Unicode字符U+0056 'V'
	char := 'V'
	
	// 使用utf8.EncodeRune
	var buf [4]byte
	n := utf8.EncodeRune(buf[:], char)
	utf8Bytes := buf[:n]
	
	fmt.Printf("Unicode字符: %c (U+%04X)\n", char, char)
	fmt.Printf("UTF-8字节: %v\n", utf8Bytes)
	fmt.Printf("十六进制: %x\n", utf8Bytes)
	fmt.Printf("字节数: %d\n", n)
}

输出:

Unicode字符: V (U+0056)
UTF-8字节: [86]
十六进制: 56
字节数: 1

方法3:处理多个字符

package main

import (
	"fmt"
)

func main() {
	// 多个Unicode字符
	unicodeStr := "Hello 世界"
	
	// 直接转换为UTF-8字节序列
	utf8Bytes := []byte(unicodeStr)
	
	fmt.Printf("原始字符串: %s\n", unicodeStr)
	fmt.Printf("UTF-8字节: %v\n", utf8Bytes)
	fmt.Printf("十六进制: %x\n", utf8Bytes)
	
	// 验证可以正确解码回来
	decodedStr := string(utf8Bytes)
	fmt.Printf("解码后字符串: %s\n", decodedStr)
}

输出:

原始字符串: Hello 世界
UTF-8字节: [72 101 108 108 111 32 228 184 150 231 149 140]
十六进制: 48656c6c6f20e4b896e7958c
解码后字符串: Hello 世界

针对你代码问题的解决方案

对于你的十六进制解码问题,错误是因为字符串"6CV4GC"包含非十六进制字符’V’。如果你想处理这种情况,可以这样修改:

package main

import (
	"encoding/hex"
	"fmt"
)

func main() {
	// 将字符'V'转换为UTF-8字节后再处理
	char := 'V'
	utf8Byte := byte(char)
	fmt.Printf("字符'V'的UTF-8字节: %d (0x%x)\n", utf8Byte, utf8Byte)
	
	// 原始十六进制解码
	decodeHex("53D6D7")
}

func decodeHex(s string) {
	b, err := hex.DecodeString(s)
	if err != nil {
		fmt.Printf("error: %v\n", err)
		return
	}
	fmt.Printf("解码结果: %v\n", b)
}

在Go中,字符串到UTF-8字节的转换是自动且高效的,因为Go内部使用UTF-8编码存储所有字符串。

回到顶部