字符编码转换

文章目录

    • 1. 背景
    • 2. 解决方案
    • 3. 编码转换实现
      • 3.1 shell实现
      • 3.2 python实现
      • 3.3 开源工具实现
    • 4. 常见中文字符编码介绍
      • 4.1 字符编码解决什么问题
      • 4.2 常见的中文字符编码
      • 4.3 常见中文字符编码关系
      • 4.4 unicide字符集与utf-8

1. 背景

在团队合作开发中,经常发现组员的代码中含有的中文字段在自己这儿显示是乱码的,使用编辑器确认才发现是使用的编码格式不一样导致,比如组员使用GBK编码,自己使用utf-8编码,就会出现乱码问题。

2. 解决方案

不同开发之间使用的编辑器字符编码格式不一样,而同一个字符,在不同编码格式中所代表的含义也是不同,这是导致乱码现象的直接原因。解决思路整体有2种:

  1. 将另外一种编码转换为自己本地的编码,或者设置本地编辑器的编码格式和对方相同;
  2. 团队之间形成约定 ,要求所有人都统一按照一种编码格式进行编码;

对于团队而言,按照方案2形成统一的约定,是最简单省事的方法。但对于像第三方或者开源的文档,是没有办法形成一个统一的,就需要采用方案1进行编码转换了。

3. 编码转换实现

3.1 shell实现

shell 下可以使用 iconv 工具进行字符编码转换

iconv工具的使用帮助如下:

用法: iconv [选项...] [文件...]
转换给定文件的编码。输入/输出格式规范:-f, --from-code=名称     原始文本编码-t, --to-code=名称       输出编码信息:-l, --list                 列举所有已知的字符集输出控制:-c                         从输出中忽略无效的字符-o, --output=文件        输出文件-s, --silent               关闭警告--verbose              打印进度信息-?, --help                 给出此帮助列表--usage                给出简要的用法信息-V, --version              打印程序版本号

将一个 gbk 编码格式的文件转换成 utf-8 格式,操作如下:

iconv -f gbk -t utf-8 gbk.txt -o utf8.txt 

注意:笔者发现使用linux下的file命令是无法显示gbk等编码格式的,显示的全部都是ISO-8859,但实际上如果使用 vscode这种编辑器查看的编码格式是gbk。因此,在不知道实际编码格式的情况下,去实现编码格式转换还是很困难的。

3.2 python实现

python实现的原理就是先用 gbk 编码打开指定的文件,读取内容,然后使用 utf-8 格式编码重新写入

def encode_conv(src_file, dst_file):with open(src_file, 'r', encoding='gbk') as f:content = f.read()with open(dst_file, 'w', encoding='utf-8') as f:f.write(content)if __name__ == '__main__':encode_conv('gbk.txt', 'utf8.txt')

这里其实也有个问题,当预先不知道文件编码的时候,使用 open打开的时候会报错,因为使用的是默认的 utf-8的编码读数据,然后读取到的字节格式不能被识别导致的。这种情况,需要预先设置一些可能的编码格式,然后进行异常处理,直至得到正确的编码格式。

3.3 开源工具实现

也可以从 github 上下载开源的转换工具实现 codetransmit转换工具

4. 常见中文字符编码介绍

4.1 字符编码解决什么问题

计算机可以识别并进行运算的只有01,世界上各种语言组成又是各不相同的,如何让这些文字可以被正常显示呢?当前的通用方案是:全部按照一种约定好的长度字节进行编码,如使用2个字节,同时建立一套2个字节的码表,把识别到的字符值去码表查找。其中,约定的长度可以定长的(gb2312gbk),也可以是变长的(utf-8)。字符编码解决的也就是按照一种约定的长度解析字节流,然后在一个事先建立好的mapping中去查找所代表的的字符。

4.2 常见的中文字符编码

  • UTF-8
  • GB2312
  • GBK
  • GB18030

4.3 常见中文字符编码关系

如下图所示:
在这里插入图片描述

!

utf-8 是一种变长的字符编码格式,使用的是 unicode 的码点编号。GB2312 和 GBK 使用的是2个字节编码格式,其中GB2312是GBK的扩展,GB18030使用的4个字节编码,可以兼容GBK和GB2312。

4.4 unicide字符集与utf-8

Unicode 为 全世界所有字符编制了一个码点符号,提供了一套映射关系。utf-8 本质使用的就是 unicode 的码点符号,所以使用utf-8可以显示所有符号,大家也尽可能的使用utf-8格式进行编码。

  • utf-8 是使用变长字节(1-6字节)来进行编码的,第一个字节的二进制中首部连续的1的个数表示实际使用的字节编码数量,其余字节默认以“10”开头。
    在这里插入图片描述

例如,“中”的utf编码格式文件使用二进制查看,实际的二进制数据为e4b8 ad0a

中(e4b8 ad0a)1110 01001011 10001010 11010000 1010

从第一个字节克可知,“中”由3个字节编码而成,按照上面的表格,去掉每个字节的首部就是

中(4E2D–>0100 1110 0010 1101)0100 1110 0010 1101

从上面可以看出,utf编码使用的码点是和unicode码点对应上的。细心的我们发现了一个事情,“中”的文本数据里面最有一个字符“a”是怎么回事?“a”的ascii代表的是“\n”,也就是换行,相当于多了一个换行符号,应该是系统自己带上的。另外也说明了对于单字节编码,首部是“0”。
code码点对应上的。细心的我们发现了一个事情,“中”的文本数据里面最有一个字符“a”是怎么回事?“a”的ascii代表的是“\n”,也就是换行,相当于多了一个换行符号,应该是系统自己带上的。另外也说明了对于单字节编码,首部是“0”。

程序员必备:彻底弄懂常见的7种中文字符编码。1


  1. 文章参考 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418605.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis安装步骤——离线安装与在线安装详解

Linux环境下Redis的离线安装与在线安装详细步骤 环境信息一、离线安装1、安装环境2、下载redis安装包3、上传到服务器并解压4、编译redis5、安装redis6、配置redis(基础配置)7、启动redis8、本机访问redis9、远程访问redis 二、在线安装1、更新yum源2、安…

k8s 高级调度

搞懂Kubernetes调度 K8S调度器Kube-schduler的主要作用是将新创建的Pod调度到集群中的合适节点上运行。kube-scheduler的调度算法非常灵活,可以根据不同的需求进行自定义配置,比如资源限制、亲和性和反亲和性等。 kube-scheduler的工作原理如下&#x…

基于SpringBoot+Vue+MySQL的宿舍维修管理系统

系统展示 前台界面 管理员界面 维修员界面 学生界面 系统背景 在当今高校后勤管理的日益精细化与智能化背景下,宿舍维修管理系统作为提升校园生活品质、优化资源配置的关键环节,其重要性日益凸显。随着学生规模的扩大及住宿条件的不断提升,宿…

Qt/C++ 个人开源项目#串口助手(源码与发布链接)

一、项目概述 该串口助手工具基于Qt/C开发,专为简化串口通信调试与开发而设计,适合新手快速上手。工具具有直观的用户界面和丰富的功能,旨在帮助用户与串口设备建立可靠通信,便于调试、数据传输和分析。 二、主要功能 波特率&a…

【Hadoop|MapReduce篇】MapReduce概述

1. MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2. Map…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步,视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能,特别是偏色检测和噪声检测,进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

2158. 直播获奖(live)

代码 #include<bits/stdc.h> using namespace std; int main() {int n,w,a[100000],cnt[601]{0},i,j,s;cin>>n>>w;for(i0;i<n;i){scanf("%d",&a[i]);cnt[a[i]];int x(i1)*w/100;if(!x) x1;for(j600,s0;j>0;j--){scnt[j];if(s>x){cou…

linux编译器——gcc/g++

1.gcc linux上先要安装&#xff0c; sudo yum install gcc gcc --version 可以查看当前的版本 &#xff0c;我们默认安装的是4.8.5的版本&#xff0c;比较低&#xff0c; gcc test.c -stdc99 可以使他支持更高版本的c标准 -o 可以殖指明生成文件的名字&#xff0c;可以自己…

重启顺风车的背后,是高德难掩的“野心”

以史鉴今&#xff0c;我们往往可以从今天的事情中&#xff0c;看到古人的智慧&#xff0c;也看到时代的进步。就如西汉后期文学家恒宽曾说的&#xff0c;“明者因时而变&#xff0c;知者随事而制”。 图源来自高德官方 近日&#xff0c;高德就展现了这样的智慧。在网约车市场陷…

电子电气架构---私有总线通信和诊断规则

电子电气架构—私有总线通信和诊断规则 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

ROS 工具箱系统要求

ROS 工具箱系统要求 要为 ROS 或 ROS 2 生成自定义消息&#xff0c;或从 MATLAB 或 Simulink 软件中部署 ROS 或 ROS 2 节点&#xff0c;您必须构建必要的 ROS 或 ROS 2 软件包。要构建这些软件包&#xff0c;您必须具备 Python 软件、CMake 软件以及适用于您的平台的 C 编译器…

文件操作与隐写

一、文件类型的识别 1、文件头完好情况&#xff1a; &#xff08;1&#xff09;file命令 使用file命令识别&#xff1a;识别出file.doc为jpg类型 &#xff08;2&#xff09;winhex 通过winhex工具查看文件头类型&#xff0c;根据文件头部内容去判断文件的类型 eg:JPG类型 &a…

3DMax基础- 创建基础模型

目录 零.软件简介 一. 标准基本型 长方体 圆锥体 球体 圆柱体 管状体 圆环 四棱锥 茶壶 平面​编辑 加强型文本 二. 扩展基本体 三.复合对象 变形 散布 一致 连接 图形合并 布尔 并集 合并 交集 差集 四.门和窗 门 窗 植物,栏杆,墙 零.软件简介 3…

JdK版本介绍

JDK&#xff08;Java Development Kit&#xff09;是Java开发的核心工具包&#xff0c;它包含了Java运行时环境&#xff08;JRE&#xff09;以及Java开发工具&#xff08;如编译器、调试器等&#xff09;。JDK的版本更新不断&#xff0c;每个版本都带来了新特性、性能改进和安全…

FreeRTOS 优先级翻转以及互斥信号量

优先级翻转&#xff1a; 高优先级的任务反而慢执行&#xff0c;低优先级的任务反而优先执行 优先级翻转在抢占式内核中是非常常见的&#xff0c;但是在实时操作系统中是不允许出现优先级翻转的&#xff0c;因为优先级翻转会破坏任务的预期顺序&#xff0c;可能会导致未知的严重…

OPenCV结构分析与形状描述符(2)计算轮廓周长的函数arcLength()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算轮廓的周长或曲线的长度。 该函数计算曲线的长度或闭合轮廓的周长。 如果曲线是闭合的&#xff08;即首尾相连&#xff09;&#xff0c;则计…

【数据结构】单链表的应用

1.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路&#xff1a; 创建新链表&#xff0c;找值不为val的节点&#xff0c;尾插到新链表中 /*** Definition for singly-li…

OpenAI发布GPT-4o mini,3.5从此退出历史舞台?

随着OpenAI在2024年7月18日正式发布GPT-4o Mini&#xff0c;无疑在科技界引发了一场新的风暴。这一创新不仅标志着GPT-3.5模型正式退出历史舞台&#xff0c;更预示着人工智能在自然语言处理领域迈入了一个全新的时代。 之前速度最快的模型一直是GPT3.5&#xff0c;随着后来的GP…

基于大数据的科研热点分析与挖掘系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 科研活动的快速发展产生了大量的学术文献&#xff0c;如何从这些文献中提炼出有价值的科研热点和趋势成为了一个重要的问题。本项目旨在开发一个基于大数据的科研热点分析可视化系统&#xff0c;采…

python tkinter 文本类组件

Label组件 Label(win,text文本,justifycenter) win指定Label组件的父容器&#xff1b;text指定标签中的文本&#xff1b;justify指定标签中拥有多行文本时&#xff0c;最后一行文本的对齐方式。 from tkinter import * from PIL import Image,ImageTkroot Tk() root.title(…