Golang中如何将中文字符编码为UTF-16
Golang中如何将中文字符编码为UTF-16 你好,
我正在尝试使用 utf16.Encode() 来编码中文字符,但出现了错误。
请问有人能帮助我解决中文字符的编码问题吗?
程序如下:
package main
import (
"fmt"
"unicode/utf16"
)
func main() {
con := "Insert into SAMPLE(ID,NAME,LOCATION,POSITION) values ('3242','中文','hyd','manager')"
a := stringToUTF16(con)
b := uTF16ToString(a)
fmt.Println(b)
}
func stringToUTF16(s string) []uint16 { return utf16.Encode([]rune(s + "\u0000")) }
func uTF16ToString(s []uint16) string {
for i, v := range s {
if v == 0 {
s = s[0:i]
break
}
}
return string(utf16.Decode(s))
}
输出:

谢谢。
更多关于Golang中如何将中文字符编码为UTF-16的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码很好。在Go Playground(Linux)中:https://play.golang.org/p/BZAPsAgEmo6。
你的代码与 windows 包中的代码类似:https://godoc.org/golang.org/x/sys/windows,
// UTF16FromString 返回 UTF-8 字符串 s 的 UTF-16 编码,
// 并添加一个终止 NUL 字符。如果 s 在任何位置包含 NUL 字节,
// 则返回 (nil, syscall.EINVAL)。
func UTF16FromString(s string) ([]uint16, error) {
for i := 0; i < len(s); i++ {
if s[i] == 0 {
return nil, syscall.EINVAL
}
}
return utf16.Encode([]rune(s + "\x00")), nil
}
// UTF16ToString 返回 UTF-16 序列 s 的 UTF-8 编码,
// 并移除终止的 NUL 字符。
func UTF16ToString(s []uint16) string {
for i, v := range s {
if v == 0 {
s = s[0:i]
break
}
}
return string(utf16.Decode(s))
}
你的问题是 Microsoft Windows。
Windows 命令提示符 (cmd.exe) 需要使用能显示中文字符的字体。NSimSun 或 SimSun-ExtB 对我来说可以工作。
此外,新的 Microsoft Windows Terminal(Microsoft Store)对我来说也可以工作。
更多关于Golang中如何将中文字符编码为UTF-16的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码中存在一个关键问题:utf16.Encode() 期望的是 []rune 参数,但你传入的是 []rune(s + "\u0000"),这会导致字符串末尾添加了额外的空字符。当解码时,你的 uTF16ToString 函数会提前截断数据,从而丢失部分字符。
以下是修正后的代码:
package main
import (
"fmt"
"unicode/utf16"
)
func main() {
con := "Insert into SAMPLE(ID,NAME,LOCATION,POSITION) values ('3242','中文','hyd','manager')"
// 编码为UTF-16
encoded := stringToUTF16(con)
fmt.Printf("编码结果: %v\n", encoded)
// 解码回字符串
decoded := uTF16ToString(encoded)
fmt.Printf("解码结果: %s\n", decoded)
}
func stringToUTF16(s string) []uint16 {
// 直接编码字符串,不需要添加空字符
return utf16.Encode([]rune(s))
}
func uTF16ToString(s []uint16) string {
// 直接解码整个切片
return string(utf16.Decode(s))
}
关键修改:
- 移除了
stringToUTF16函数中的+ "\u0000"操作 - 简化了
uTF16ToString函数,直接解码整个切片
如果你确实需要在UTF-16编码后添加空字符(例如某些Windows API需要),可以这样修改:
func stringToUTF16WithNull(s string) []uint16 {
runes := []rune(s + "\x00")
return utf16.Encode(runes)
}
func uTF16ToStringWithNull(s []uint16) string {
// 查找空字符位置
for i, v := range s {
if v == 0 {
return string(utf16.Decode(s[:i]))
}
}
return string(utf16.Decode(s))
}
这样就能正确处理中文字符的UTF-16编码和解码了。

