golang 字符编码 gbk/gb2312 utf8编码相互转换,判断字符是否gbk编码函数, 字符编码转换基础原理解析, golang默认编码utf8
虽然golang里面的默认编码都是统一的unicode utf8编码, 但是我们在调用外部系统提供的api时,就可能会遇到别人的接口提供的编码非 utf8编码,而是gbk/gb2312编码, 这时候我们就必须要将别人的gbk编码转换为go语言里面的默认编码utf8。
字符编码转换基础原理解析
要对编码进行转换,我们就需要知道go语言里面的字符表示形式,在go语言里面,任何的字符都是通过类型byte(也就是类型 uint8 )来进行表示的, 即任何的字符在go语言里面最终都会被转换为对应的byte数字。 而同一个字符,不同的编码方式,他们对应的数字是不一样的。 我们的编码转换实际上也很简单,我们只需要先了解某个编码他们所表示的数字范围后即可很轻松的进行转换。
GBK UTF8字符,字符串相互转换函数
// gbk to utf8 encoding conversion
func GbkToUtf8(s []byte) ([]byte, error) {reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder())d, e := io.ReadAll(reader)if e != nil {return nil, e}return d, nil
}// utf8 to gbk encoding conversion
func Utf8ToGbk(s []byte) ([]byte, error) {reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewEncoder())d, e := io.ReadAll(reader)if e != nil {return nil, e}return d, nil
}// 字符串编码 gbk到utf8转换
func StrGbkToUtf8(str string) (string, error) {data, err := GbkToUtf8([]byte(str))return string(data), err
}// 字符串编码 utf8到gbk转换
func StrUtf8ToGbk(str string) (string, error) {data, err := Utf8ToGbk([]byte(str))return string(data), err
}
是否GBK/GB2312编码字符、字符串判断函数
// 判断数据是否是gbk编码
func IsGbkData(data []byte) bool {length := len(data)var i int = 0for i < length {// // ASCII 编码的范围: 十进制 => 0 - 127 。 十六进制: 0x00 - 0x7F 。if data[i] <= 127 {i++continue} else {// GB2312编码的范围: 十进制 => 高位字节:161 - 247, 十六进制:0xA1 - 0xF7// 低位字节:161 - 254 , 十六进制:0xA1 - 0xFEif data[i] >=129 &&data[i] <= 254 &&data[i+1] >= 64 &&data[i+1] <= 254 &&data[i+1] <= 247 {i += 2continue} else {return false}}}return true
}// 判断字符串是否是gbk编码
func IsGbkStr(str string) bool {if str == "" {return false}return IsGbkData([]byte(str))
}
使用方法
- 安装依赖: go get github.com/tekintian/go-str-utils
- 使用示例:
package mainimport (strutils "github.com/tekintian/go-str-utils"
)func main() {// gb2312测试数据gb2312Data := []uint8{10, 10, 10, 10, 10, 123, 34, 105, 112, 34, 58, 34, 49, 49, 50, 46, 49, 49, 55, 46, 55, 53, 46, 57, 57, 34, 44, 34, 112, 114, 111, 34, 58, 34, 212, 198, 196, 207, 202, 161, 34, 44, 34, 112, 114, 111, 67, 111, 100, 101, 34, 58, 34, 53, 51, 48, 48, 48, 48, 34, 44, 34, 99, 105, 116, 121, 34, 58, 34, 192, 165, 195, 247, 202, 208, 34, 44, 34, 99, 105, 116, 121, 67, 111, 100, 101, 34, 58, 34, 53, 51, 48, 49, 48, 48, 34, 44, 34, 114, 101, 103, 105, 111, 110, 34, 58, 34, 34, 44, 34, 114, 101, 103, 105, 111, 110, 67, 111, 100, 101, 34, 58, 34, 48, 34, 44, 34, 97, 100, 100, 114, 34, 58, 34, 212, 198, 196, 207, 202, 161, 192, 165, 195, 247, 202, 208, 32, 181, 231, 208, 197, 34, 44, 34, 114, 101, 103, 105, 111, 110, 78, 97, 109, 101, 115, 34, 58, 34, 34, 44, 34, 101, 114, 114, 34, 58, 34, 34, 125, 10, 10, 10, 10}if strutils.IsGbkData(gb2312Data) {// gbk编码的数据,需要进行转换为utf8utf8Data, err := strutils.GbkToUtf8(bytes)if err != nil {// 转换失败。。。。}// 转换成功 这里 utf8Data 就是utf8编码的数据了}}
总结:
1. GBK/GB2312编码的范围: 十进制 => 高位字节:161 - 247, 十六进制:0xA1 - 0xF7 ; 低位字节:161 - 254 , 十六进制:0xA1 - 0xFE
2. 相同的字符 不同的编码他们的最终字符长度都是不一样的,因为不同编码他们所占据的字节位数不一样。
相关文章:

golang 字符编码 gbk/gb2312 utf8编码相互转换,判断字符是否gbk编码函数, 字符编码转换基础原理解析, golang默认编码utf8
虽然golang里面的默认编码都是统一的unicode utf8编码, 但是我们在调用外部系统提供的api时,就可能会遇到别人的接口提供的编码非 utf8编码,而是gbk/gb2312编码, 这时候我们就必须要将别人的gbk编码转换为go语言里面的默认编码ut…...
CentOS(7.x、8)上安装EMQX
EMQX 是一个高度可扩展的分布式 MQTT 消息服务器,适用于 IoT、M2M 和移动应用程序。以下是在 CentOS 系统上安装 EMQX 的基本步骤: 在 CentOS 上安装 EMQ X 步骤 1: 添加 EMQ X YUM 源 首先,你需要添加 EMQ X 的官方 YUM 源到你的 CentOS 系…...
Mojo模型魔法:动态定制特征转换的艺术
标题:Mojo模型魔法:动态定制特征转换的艺术 在机器学习领域,模型的灵活性和可扩展性是至关重要的。Mojo模型(Model-as-a-Service)提供了一种将机器学习模型部署为服务的方式,允许开发者和数据科学家轻松地…...

多任务高斯过程数学原理和Pytorch实现示例
高斯过程其在回归任务中的应用我们都很熟悉了,但是我们一般介绍的都是针对单个任务的,也就是单个输出。本文我们将讨论扩展到多任务gp,强调它们的好处和实际实现。 本文将介绍如何通过共区域化的内在模型(ICM)和共区域化的线性模型(LMC)&…...

【PPT把当前页输出为图片】及【PPT导出图片模糊】的解决方法(sci论文图片清晰度)
【PPT把当前页输出为图片】及【PPT导出图片模糊】的解决方法 内容一:ppt把当前页输出为图片:内容二:ppt导出图片模糊的解决方法:方法:步骤1:打开注册表编辑器步骤2:修改注册表: 该文…...

TeraTerm 使用技巧
参考资料 自分がよく使うTeratermマクロによる自動ログインのやり方をまとめてみたよTera Term マクロでログインを自動化してみたTera Term のススメ 目录 简介一. 常用基础设置1.1 语言变更1.2 log设置 二. 小技巧2.1 指定host别名2.2 新开窗口2.3 设置粘贴多行命令时的行间…...

意得润色打折啦
新注册使用可以减15%,ABSJU202,直接使用哦ㅤ 此外,如果老板经费充足,预算高,完全可以试试他家的投稿套餐,科学深度编辑,从期刊选择,到投稿协助,投稿信都帮你写好…...

微软研发致胜策略 06:学无止境
这是一本老书,作者 Steve Maguire 在微软工作期间写了这本书,英文版于 1994 年发布。我们看到的标题是中译版名字,英文版的名字是《Debugging the Development Process》,这本书详细阐述了软件开发过程中的常见问题及其解决方案&a…...

学习大数据DAY21 Linux基本指令2
目录 思维导图 搜索查看查找类 find 从指定目录查找文件 head 与 tail 查看行 cat 查看内容 more 查看大内容 grep 过滤查找 history 查看已经执行过的历史命令 wc 统计文件 du 查看空间 管道符号 | 配合命令使用 上机练习 4 解压安装类 zip unzip 压缩解压 tar …...
【18】Android 线程间通信(三) - Handler
概述 接下来我们会从native层来分析一下,Handler做了什么,以及之前提到过的应用层的两个native的调用链。 nativeWake 最早接触这个方法还记得是什么时候吗?MessageQueue#enqueueMessage中,在这个方法的末尾,我们看…...

静态路由技术
一、路由的概念 路由是指指导IP报文发送的路径信息。 二、路由表的结构 1、Destination/Mask:IP报文的接收方的IP地址及其子网掩码; 2、proto:协议(Static:静态路由协议,Direct:表示直连路由) 3、pref:优先级(数值和优先级成反比) 4、cost:路由开销(从源到目的…...

SpringBoot缓存注解使用
背景 除了 RedisTemplate 外, 自Spring3.1开始,Spring自带了对缓存的支持。我们可以直接使用Spring缓存技术将某些数据放入本机的缓存中;Spring缓存技术也可以搭配其他缓存中间件(如Redis等)进行使用,将某些数据写入到缓存中间件…...
@RequestBody接收到的参数中如何限制List的长度?
在Spring MVC中,你可以使用Valid注解和自定义的验证注解来限制List的长度,防止DOS攻击。具体步骤如下: 创建自定义注解:首先,创建一个自定义注解来验证List的长度。 import javax.validation.Constraint; import jav…...
Linux C语言 54-目录操作
Linux C语言 54-目录操作 本节关键字:Linux、C语言、目录操作、遍历目录 相关C库函数:opendir、readdir、closedir 遍历目录 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <dirent.h> #include <…...

Java实战中如何使用多线程(线程池)及其为什么使用?
这个话题在入行之前就想过很多次,很多8古文或者你搜索的结果都是告诉你什么提高高并发或者是一些很高大上的话,既没有案例也没有什么公式去证明,但是面试中总是被问到,也没有实战经历,所以面试时一问到多线程的东西就无…...

kafka集群搭建-使用zookeeper
1.环境准备: 使用如下3台主机搭建zookeeper集群,由于默认的9092客户端连接端口不在本次使用的云服务器开放端口范围内,故端口改为了8093。 172.2.1.69:8093 172.2.1.70:8093 172.2.1.71:8093 2.下载地址 去官网下载,或者使用如…...

【python】Numpy运行报错分析:IndexError与形状不匹配问题
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
你有多自律就有多自由
当你失去对时间的控制权,生活也就失去了平衡。 真正对自己有要求的人,都是高度自律的人。 追求自己想要的生活,任何时候开始都不会晚,关键在于你能够坚持下去,以高度自律的精神,日复一日、年复一年的坚持下…...
Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解
Problem A. Diverse Game Statement 给定 n m n\times m nm 的矩形 a a a, a a a 中的每一个数均在 1 ∼ n m 1\sim nm 1∼nm 之间且互不相同。求出 n m n\times m nm 的矩形 b b b, b b b 中的每一个数均在 1 ∼ n m 1\sim nm 1∼nm 之间且互…...

WSL2 Centos7 Docker服务启动失败怎么办?
wsl 安装的CentOS7镜像,安装了Docker之后,发现用systemctl start docker 无法将docker启动起来。 解决办法 1、编辑文件 vim /usr/lib/systemd/system/docker.service将13行注释掉,然后在下面新增14行的内容。然后保存退出。 2、再次验证 可以发现,我们已经可以正常通过s…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...