字符集——带你了解UTF-8的前世今生
文章目录
- 字符集的来历
- 汉字和字母的编码特点
- Unicode字符集
- 字符集小结
- 编码和解码
- 开发约定
字符集的来历
计算机是美国人发明的,由于计算机能够处理的数据只能是0和1组成的二进制数据,为了让计算机能够处理字符,于是美国人就把他们会用到的每一个字符进行了编码(所谓编码,就是为一个字符编一个二进制数据),如下图所示:(图片来自于百度百科,只需要了解常见的英文字母(大小写)、数字等就好了,不需要细究)

美国人常用的字符有英文字母、标点符号、数字以及一些特殊字符,这些字符一共也不到128个,所以他们用1个字节来存储1字符就够了。 美国人把他们用到的字符和字符对应的编码总结成了一张码表,这张码表叫做ASCII码表(也叫ASCII字符集)。
其实计算机只在美国用是没有问题的,但是计算机慢慢的普及到全世界,当普及到中国的时候,在计算机中想要存储中文,那ASCII字符集就不够用了,因为中文太多了,随便数一数也有几万个字符。
于是中国人为了在计算机中存储中文,也编了一个中国人用的字符集叫做GBK字符集,这里面包含2万多个汉字字符,GBK中一个汉字采用两个字节来存储,为了能够显示英文字母,GBK字符集也兼容了ASCII字符集,在GBK字符集中一个字母还是采用一个字节来存储。
汉字和字母的编码特点
如果一个文件中既有中文,也有英文,那计算机怎么知道哪几个字节表示一个汉字,哪几个字节表示一个字母呢?
比如:在文件中存储一个我he你,底层其实存储的是这样的二进制数据。
需要我们注意汉字和字母的编码特点:
-
- 如果是存储字母,采用1个字节来存储,一共8位,其中第1位是0
- 如果是存储汉字,采用2个字节来存储,一共16位,其中第1位是1
当读取文件中的字符时,通过识别读取到的第1位是0还是1来判断是字母还是汉字
- 如果读取到第1位是0,就认为是一个字母,此时往后读1个字节。
- 如果读取到第1位是1,就认为是一个汉字,此时往后读2个字节。
也即,GBK规定了汉字的第一个字节的第一位必须是1.
Unicode字符集
咱们国家可以用GBK字符集来表示中国人使用的文字,那世界上还有很多其他的国家,他们也有自己的文字,他们也想要自己国家的文字在计算机中处理,于是其他国家也在搞自己的字符集,就这样全世界搞了上百个字符集,而且各个国家的字符集互不兼容。 这样其实很不利于国际化的交流,可能一个文件在我们国家的电脑上打开好好的,但是在其他国家打开就是乱码了。
为了解决各个国家字符集互不兼容的问题,由国际化标准组织牵头,设计了一套全世界通用的字符集,叫做Unicode字符集。在Unicode字符集中包含了世界上所有国家的文字,一个字符采用4个字节才存储。
在Unicode字符集中,采用一个字符4个字节的编码方案,又造成另一个问题:如果是说英语的国家,他们只需要用到26大小写字母,加上一些标点符号就够了,本身一个字节就可以表示完,用4个字节就有点浪费。
于是又对Unicode字符集中的字符进行了重新编码,一共设计了三种编码方案。分别是UTF-32、UTF-16、UTF-8; 其中比较常用的编码方案是UTF-8
UTF-8这种编码方案的特点总结如下:
1.UTF-8是一种可变长的编码方案,共分为4个长度区
2.英文字母、数字占1个字节兼容(ASCII编码)
3.汉字字符占3个字节
4.极少数字符占4个字节
字符集小结
ASCII字符集:《美国信息交换标准代码》,包含英文字母、数字、标点符号、控制字符
特点:1个字符占1个字节
GBK字符集:中国人自己的字符集,兼容ASCII字符集,还包含2万多个汉字
特点:1个字母占用1个字节;1个汉字占用2个字节
Unicode字符集:包含世界上所有国家的文字,有三种编码方案,最常用的是UTF-8
UTF-8编码方案:英文字母、数字占1个字节兼容(ASCII编码)、汉字字符占3个字节
编码和解码
其实String类类中就提供了相应的方法,可以完成编码和解码的操作。
- 编码:把字符串按照指定的字符集转换为字节数组
- 解码:把字节数组按照指定的字符集转换为字符串
示例代码如下所示:
/*** 目标:掌握如何使用Java代码完成对字符的编码和解码。*/
public class Test {public static void main(String[] args) throws Exception {// 1、编码String data = "a我b";byte[] bytes = data.getBytes(); // 默认是按照平台字符集(UTF-8)进行编码的。System.out.println(Arrays.toString(bytes));// 按照指定字符集进行编码。byte[] bytes1 = data.getBytes("GBK");System.out.println(Arrays.toString(bytes1));// 2、解码String s1 = new String(bytes); // 按照平台默认编码(UTF-8)解码System.out.println(s1);String s2 = new String(bytes1, "GBK");System.out.println(s2);}
}
开发约定
开发一个项目的时候,最开始的时候,首先要设定的就是代码的编码格式,如果不约定好,后面很容易因为各种编码混用造成乱码。一个项目具体的编码格式一般来说统一就好,要按照实际需求来。例如我曾经实习的时候就约定好了
.java文件使用GBK编码;其他文件都一致使用UTF-8编码。
相关文章:
字符集——带你了解UTF-8的前世今生
文章目录 字符集的来历汉字和字母的编码特点Unicode字符集字符集小结编码和解码开发约定 字符集的来历 计算机是美国人发明的,由于计算机能够处理的数据只能是0和1组成的二进制数据,为了让计算机能够处理字符,于是美国人就把他们会用到的每一…...
数据分析工具比较:Excel vs Python vs R
写在开头 在数据分析的世界里,选择合适的工具至关重要。本篇博客将深入比较常用的数据分析工具,包括Excel、Python和R,以帮助读者更好地选择适合自己需求的工具。 1.Excel:经典易用的电子表格 优势: 用户友好&…...
Java基础数据类型
Java有八种基础的数据类型,它们被分为两个主要的类别:原始类型和引用类型。原始类型又被分为四类:整型、浮点型、字符型和布尔型。 整型(Integral Types): 这些类型用于存储整数。它们包括: ○…...
Linux-Linux安装JDK及配置环境 及 遇到的问题
下载linux环境对应的JDK的tar.gz包 配置JDK环境:编辑 sudo vim /etc/profile 在文件的最下方,填写 export JAVA_HOME/usr/local/src/software/jdk1.8 export CLASSPATH.:$JAVA_HOME/lib/tools.jar export PATH$JAVA_HOME/bin:$PATH 执行生效命令&…...
后端架构的一些知识
目录 一.抖音 二.大型网站是如何管理海量的数据的 三.大型网站停机一天会造成多大损失 四.如何设计一套安全,健壮,可扩展,稳定性强的后端系统 五.如何在不影响原来代码的基础上进行功能更新 六.大型网站一年都不停机吗 七.线上业务出现…...
golang使用sip实现语音通话
在使用 github.com/cloudwebrtc/sip 这个 Go 语言库时,要实现通话,您需要处理 SIP 协议的一系列操作,包括建立和终止呼叫、处理媒体传输等。以下是一个简化的示例代码,演示如何使用该库来处理 SIP 通话的基本流程: pac…...
【1day】蓝凌OA 系统custom.jsp 接口任意文件读取漏洞学习
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞概述 二、影响版本 三、资产测绘 四、漏洞复现...
OWASP Web 安全测试指南-Web 应用程序安全测试
Web 应用程序安全测试 4.0 简介和目标 4.1 信息收集 4.2 配置和部署管理测试 4.3 身份管理测试 4.4 身份验证测试 4.5 授权测试 4.6 会话管理测试 4.7 输入验证测试 4.8 错误处理测试 4.9 弱密码测试 4.10 业务逻辑测试 4.11 客户端测试 4.0 简介和目标 本节介绍 O…...
oracle FUNCTION(任意两个时间 之间的工作小时)
写函数计算 任意两个时间 之间的工作小时 每天工作时间(8:00 - 20:00 共12小时),没有休息日 CREATE OR REPLACE FUNCTION SC_YD_DESI.CALCULATE_WORK_HOURS_FUNC (p_current_time IN DATE,p_order_time IN DATE ) RETURN NUMBER ASp_work_hou…...
【“C++ 精妙之道:解锁模板奇谭与STL精粹之门“】
【本节目标】 1. 泛型编程 2. 函数模板 3. 类模板 4. 什么是STL 5. STL的版本 6. STL的六大组件 7. STL的重要性 8. 如何学习STL 9.STL的缺陷 1. 泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& right) {int temp left;lef…...
el-date-picker时间控制范围为过去时间不可选
<el-date-picker :picker-options"startPickerOptions()" value-format"yyyy-MM-dd HH:mm:ss" v-model"form.applyFixPlan" type"datetime" placeholder"选择日期时间"> </el-date-picker> 在method中定义star…...
音视频技术开发周刊 | 322
每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 超级AI不会主宰人类,但人工智能必须开源!LeCun最新采访引全网300万人围观 LeCun最新访谈视频中,再次坦露了自己对开源AI的看法。超级AI…...
面试就是这么简单,offer拿到手软(三)—— 常见中间件框架面试题,es,redis,dubbo,zookeeper kafka 等
面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路 面试就是这么简单,offer拿到手软(二)—— 常见65道非技术面试问题 面试就是这么简单,offer拿到手软(三ÿ…...
【Spring系列】DeferredResult异步处理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
使用晶振遇到的两个问题
并联电阻的问题 在一些方案中,晶振并联1MΩ电阻时,程序运行正常,而在没有1MΩ电阻的情况下,程序运行有滞后及无法运行现象发生。 原因分析: 在无源晶振应用方案中,两个外接电容能够微调晶振产生的时钟频率…...
手写promise A+、catch、finally、all、allsettled、any、race
目录 手写promise 同步版 1.Promise的构造方法接收一个executor(),在new Promise()时就立刻执行executor回调 2.executor()内部的异步任务被放入宏/微任务队列,等待执行 3.状态与结果的管理 状态只能变更一次 4.then()调用成功/失败回调 catch是…...
【原神游戏开发日志1】缘起
【原神游戏开发日志1】缘起 版权声明 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明 文章内容不得删减、修改、演绎 相关学习资源见文末 大家好,最近看到原神在TGA上频频获奖,作为一个14年经验的游戏开…...
leetcode5 最长公共前缀三种python解法
14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight"] 输出:"fl"示…...
对小程序的初了解
WXML和HTML的区别 标签名称不同 HTML:div、a、span、img WXML:view、text、image、navigator 属性节点不同 <a href"#">超链接</a> <navigator url"/pages/home/home"></navigator> 提供了类似vue的…...
QLineEdit 的 InputMask掩码
QLineEdit 的 InputMask掩码 A:只能输入字母,且不可省略 a:只能输入字母,可以省略 N:只能输入 字母和数字,且不可省略 n:只能输入 字母和数字,可以省略 X:可以输入任意字…...
FDS:高性能火灾动力学模拟的技术革新与工程实践
FDS:高性能火灾动力学模拟的技术革新与工程实践 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 一、核心价值:重新定义火灾安全工程的仿真范式 Fire Dynamics Simulator (FDS) 作为火灾科学领域…...
HDMI转VGA转换器硬件设计实战:基于MX9291的电路实现
1. HDMI转VGA转换器的核心价值与应用场景 当你手头有一台只有VGA接口的老显示器,而电脑却只有HDMI输出时,MX9291芯片就是解决这个兼容性问题的钥匙。这种转换需求在企业和教育领域特别常见——很多会议室和教室的投影仪至今仍在使用VGA接口。我去年就帮朋…...
FPGA设计优化:如何用Vivado的opt_directive提升性能(附真实案例)
FPGA设计优化:Vivado的opt_directive实战指南与性能提升策略 在FPGA设计流程中,逻辑优化是提升性能的关键环节。Xilinx Vivado Design Suite提供的opt_design命令及其directive参数,为工程师提供了精细控制优化策略的能力。本文将深入探讨如何…...
EdgeRemover:Windows Edge浏览器彻底卸载的智能方案 - 释放系统资源新方法
EdgeRemover:Windows Edge浏览器彻底卸载的智能方案 - 释放系统资源新方法 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 核心价值定位 用…...
告别手动上传!RAGFlow 0.22.0 数据源同步实战:以S3和Notion为例的保姆级配置
告别手动上传!RAGFlow 0.22.0 数据源同步实战:以S3和Notion为例的保姆级配置 如果你还在为知识库维护中频繁的手动上传文件而烦恼,RAGFlow 0.22.0版本的数据源功能将成为你的效率救星。这个功能彻底改变了传统文件管理方式,让数据…...
SmallThinker-3B-Preview惊艳表现:复杂逻辑推理任务准确率提升实测报告
SmallThinker-3B-Preview惊艳表现:复杂逻辑推理任务准确率提升实测报告 最近,一个名为SmallThinker-3B-Preview的小模型在技术社区里悄悄火了起来。你可能要问,现在动辄几百亿参数的大模型满天飞,一个只有30亿参数的“小家伙”有…...
孟德尔随机化实战(五)—— 告别报错!Error in if (out == “[]“) 深度解析与TwoSampleMR参数调优全攻略
1. 报错现象深度解析:为什么会出现"参数长度为零"? 最近在孟德尔随机化分析交流群里,这个报错出现的频率简直高得离谱:"Error in if (out "[]") { : argument is of length zero"或者它的中文版&q…...
旧电脑秒变云服务器:用Proxmox VE打造家庭虚拟化实验室(ZFS配置优化版)
旧电脑秒变云服务器:用Proxmox VE打造家庭虚拟化实验室(ZFS配置优化版) 1. 为什么选择Proxmox VE搭建家庭实验室? 对于个人开发者和技术爱好者来说,拥有一套完整的虚拟化环境是提升技术能力的绝佳途径。Proxmox VE作为…...
Wan2.2-I2V-A14B与数据库联动:自动化生成电商商品动态详情页视频
Wan2.2-I2V-A14B与数据库联动:自动化生成电商商品动态详情页视频 1. 电商视频制作的痛点与机遇 电商平台每天都有大量新品上架,传统的商品详情页视频制作方式面临巨大挑战。一个中型电商平台每月可能新增上千款商品,如果每款商品都需要人工…...
【搭建单双目散斑结构光Demo】
介绍 最近搭了一个用于研究的单目散斑结构光的硬件Demo。发射端使用VCSEL模组投影散斑,接收端使用工业相机采集图像。工业相机曝光时输出同步信号给驱动板,驱动板控制VCSEL发光投射出散斑图案,同步时间精度可以达到十微秒。也可以配两个工业…...
