golang unicode形态的[]byte, 转行成utf8形态的string


func u16To8(u16 []byte) string {
	log.Println("u16 = ", u16)
	if len(u16)%2 != 0 {
		log.Println("err len", len(u16))
		return ""
	}

	var body bytes.Buffer

	for i := 0; i < len(u16)/2; i++ {
		v := int(u16[2*i]) + int(u16[2*i+1])<<8
		log.Println(int(u16[2*i]), int(u16[2*i+1])<<8)
		log.Println("v = ", v)
		if v <= 127 {

			body.WriteByte(byte(v))
		} else if v <= 2047 {
			a1 := byte(v&63) + 128

			v = v >> 6
			a2 := byte(v&31) + 192
			body.WriteByte(a2)
			body.WriteByte(a1)

		} else if v <= 65535 {
			a1 := byte(v&63) + 128

			v = v >> 6
			a2 := byte(v&63) + 128

			v = v >> 6
			a3 := byte(v&15) + 224
			body.WriteByte(a3)
			body.WriteByte(a2)
			body.WriteByte(a1)
		}
	}
	return string(body.Bytes())
}

 

import (
	"bytes"
	"log"
	"strings"

	"golang.org/x/text/encoding"
	"golang.org/x/text/encoding/unicode"
)


var decoder *encoding.Decoder

func init() {
	decoder = unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder()
}

// 官方库

str, _ := decoder.Bytes(data[nOffset:nNewOffset])
return string(str)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值