常见的几种编码方式
常见的编码方式及其特点:
编码方式的设计是为了适应不同的字符集和应用需求,因此它们在表示字符时使用的位数和字节数各不相同
-
常见编码方式及其位数和字节数
-
ASCII(American Standard Code for Information Interchange):
- 位数:7位
- 字节数:1字节(8位,但最高位固定为0)
- 字符范围:128个字符(包括英文字母、数字、标点符号和控制字符)
-
ISO 8859-1(Latin-1):
- 位数:8位
- 字节数:1字节
- 字符范围:256个字符(包括西欧语言的字符)
-
GB2312:
- 位数:16位
- 字节数:2字节
- 字符范围:6763个汉字及其他字符(主要用于简体中文)
-
BIG5:
- 位数:16位
- 字节数:2字节
- 字符范围:13053个汉字及其他字符(主要用于繁体中文)
-
Unicode:
- 位数:16位或32位
- 字节数:2字节或4字节(具体取决于编码方式)
- 字符范围:几乎所有已知字符(涵盖全球所有语言)
-
UTF-8(Unicode Transformation Format - 8-bit):
- 位数:8位到32位
- 字节数:1到4字节(变长编码)
- 字符范围:所有Unicode字符
- 1字节(7位):用于ASCII字符(0x00 - 0x7F)
- 2字节(11位):用于扩展字符(0x80 - 0x7FF)
- 3字节(16位):用于基本多文种平面(BMP)字符(0x800 - 0xFFFF)
- 4字节(21位):用于补充字符(0x10000 - 0x10FFFF)
-
UTF-16(Unicode Transformation Format - 16-bit):
- 位数:16位或32位
- 字节数:2字节或4字节
- 字符范围:所有Unicode字符
- 2字节(16位):用于基本多文种平面(BMP)字符(0x0000 - 0xFFFF)
- 4字节(32位):用于补充字符(0x10000 - 0x10FFFF)
-
UTF-32(Unicode Transformation Format - 32-bit):
- 位数:32位
- 字节数:4字节
- 字符范围:所有Unicode字符(直接使用32位表示)
-
为什么UTF-8可以编码中文,而其他的编码方式不行?
原理解释:
-
ASCII:只有128个字符,不可能表示中文这样的复杂字符。
-
ISO 8859-1:扩展到256个字符,但主要用于西欧语言字符,不包括中文。
-
GB2312 和 BIG5:这两种编码方式是专门为中文设计的,但它们有各自的局限性,不能表示所有的中文字符。
-
Unicode:它是一个统一的编码标准,包含了全球所有已知的字符。Unicode为每个字符分配一个唯一的编码点(code point),例如“中”字的编码点是U+4E2D。
-
UTF-8:
- UTF-8是Unicode的一种实现方式,它使用可变长度的字节来编码字符。
- 对于中文字符,UTF-8通常使用3个字节表示。UTF-8的第一个字节的高位部分指示了该字符需要的总字节数。例如,一个中文字符的第一个字节的高位部分可能是1110xxxx,这表示需要三个字节。后面的两个字节的高位部分是10xxxxxx,表示这是一个多字节字符的一部分。
- 这种可变长度的设计使得UTF-8可以非常高效地编码各种语言的字符,同时保持对ASCII的兼容性。
详细原理:
-
中文汉字在UTF-8编码中通常是三个字节,但这并不是绝对的。具体来说,UTF-8编码的长度取决于字符的Unicode编码点范围。下面是UTF-8编码的基本规则:
- 单字节字符(0x00 - 0x7F):1字节,最高位为0。例如,ASCII字符“a”编码为0x61。
- 双字节字符(0x80 - 0x7FF):2字节,第一个字节为110xxxxx,第二个字节为10xxxxxx。
- 三字节字符(0x800 - 0xFFFF):3字节,第一个字节为1110xxxx,后两个字节为10xxxxxx。
- 四字节字符(0x10000 - 0x10FFFF):4字节,第一个字节为11110xxx,后三个字节为10xxxxxx。
总结
大多数中文汉字在UTF-8中是三个字节,
但对于超过基本多文种平面的汉字,则需要使用四个字节表示。UTF-8通过这种可变长度的设计,能够有效地表示包括中文在内的所有Unicode字符。
大多数常用的中文汉字的Unicode编码点范围在0x4E00到0x9FFF之间,因此在UTF-8中表示为三个字节。例如,“中”字的Unicode编码是U+4E2D,在UTF-8中编码为E4 B8 AD。
然而,也有一些特殊的汉字或者罕见的汉字,它们的Unicode编码点超出了0xFFFF,需要使用四个字节来表示。以下是几个例子:
例子1:“𠀀”(CJK扩展B区第一个字符)
Unicode编码:
- “𠀀”字的Unicode编码是U+20000。
转换为二进制:
- 20000(十六进制)转换为二进制是0010 0000 0000 0000 0000。
根据UTF-8的编码规则进行分组:
- UTF-8编码四字节格式:
- 第一个字节:11110xxx
- 第二个字节:10xxxxxx
- 第三个字节:10xxxxxx
- 第四个字节:10xxxxxx
应用到“𠀀”字的二进制表示:
- 将0010 0000 0000 0000 0000分配到UTF-8的四个字节中:
- 第一个字节:1111 0000
- 第二个字节:1010 0000
- 第三个字节:1000 0000
- 第四个字节:1000 0000
最终UTF-8编码表示:
- 第一个字节:11110000 (F0)
- 第二个字节:10100000 (A0)
- 第三个字节:10000000 (80)
- 第四个字节:10000000 (80)
c++ String
C++ 的 std::string 是一个通用的字符串容器,它本身并不依赖于特定的字符编码。这种设计使得 std::string 可以存储不同编码的字符串。下面详细解释其中的原因和机制。
std::string 的设计
-
字节序列容器:
std::string本质上是一个字节序列的容器,可以存储任意的字节数据。- 它不关心这些字节数据的具体含义,这使得它可以存储不同编码的字符串。
-
字符编码无关性:
std::string并不强制要求字符串使用特定的编码。- 可以将任何编码的字符数据(如ASCII、UTF-8、ISO 8859-1等)存储在
std::string中。
-
灵活的内存管理:
std::string使用动态内存管理,可以灵活地调整其容量以适应存储的字符数据。- 这使得它可以存储从短的ASCII字符串到长的多字节编码字符串(如UTF-8)。
#include <iostream>
#include <string>int main() {// ASCII编码的字符串std::string ascii_str = "Hello, World!";std::cout << "ASCII: " << ascii_str << std::endl;// UTF-8编码的字符串std::string utf8_str = u8"你好,世界!";std::cout << "UTF-8: " << utf8_str << std::endl;// ISO 8859-1编码的字符串std::string iso8859_1_str = "\xA1\xA2\xA3";std::cout << "ISO 8859-1: " << iso8859_1_str << std::endl;return 0;
}
std::wstring 和宽字符
对于需要处理Unicode字符的应用,C++还提供了宽字符字符串类型 std::wstring。std::wstring 使用 wchar_t 类型存储字符,每个字符的大小依赖于具体实现(通常是2或4字节),可以更方便地处理多字节编码的字符数据,如UTF-16。
#include <iostream>
#include <string>int main() {// UTF-16编码的宽字符字符串std::wstring utf16_str = L"你好,世界!";std::wcout << L"UTF-16: " << utf16_str << std::endl;return 0;
}
编码转换
在实际应用中,可能需要在不同编码之间进行转换。C++11及之后的标准库提供了 codecvt 来支持字符编码转换。
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>int main() {// UTF-8 to UTF-16std::string utf8_str = u8"你好,世界!";std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;std::wstring utf16_str = converter.from_bytes(utf8_str);std::wcout << L"UTF-16: " << utf16_str << std::endl;// UTF-16 to UTF-8std::string utf8_converted = converter.to_bytes(utf16_str);std::cout << "UTF-8: " << utf8_converted << std::endl;return 0;
}
总结
std::string是一个通用的字节序列容器,可以存储不同编码的字符串,因为它本质上是存储字节数据而不是特定的字符编码。std::wstring提供了处理宽字符的支持,适用于多字节编码的字符数据。- 对于字符编码的转换和处理,需要使用适当的工具和库,例如
codecvt。
相关文章:
常见的几种编码方式
常见的编码方式及其特点: 编码方式的设计是为了适应不同的字符集和应用需求,因此它们在表示字符时使用的位数和字节数各不相同 常见编码方式及其位数和字节数 ASCII(American Standard Code for Information Interchange)&#x…...
ubuntu移动硬盘重命名
因为在ubuntu上移动硬盘的名字是中文的,所以想要改成英文的。 我的方法: 将移动硬盘插到windows上,直接右键重命名。再插到ubuntu上名字就改变了。 别人的方法: ubuntu下如何修改U盘名字-腾讯云开发者社区-腾讯云 在自带的软件…...
VUE框架前置知识总结
一、前言 在学习vue框架中,总是有些知识不是很熟悉,又不想系统的学习JS,因为学习成本太大了,所以用到什么知识就学习什么知识。此文档就用于记录零散的知识点。主要是还是针对与ES6规范的JS知识点。 以下实验环境都是在windows环…...
张宇1000题80%不会?别急,这个方法肯定有用!
这太正常了,1000题的难度本来就高,不要慌 我考研的时候跟的也是张宇老师,但是1000题我根本就没做几道题就给换成880题660题了,而且只是强化阶段用880题,基础阶段我用的都是汤家凤的1800题。 不要担心做的不是张宇老师…...
【python】爬虫记录每小时金价
数据来源: https://www.cngold.org/img_date/ 因为这个网站是数据随时变动的,用requests、BeautifulSoup的方式解析html的话,数据的位置显示的是“--”,并不能取到数据。 所以采用webdriver访问网站,然后从界面上获取…...
一行命令将已克隆的本地Git仓库推送到内网服务器
一、需求背景 我们公司用gitea搭建了一个git服务器,其中支持win7的最高版本是v1.20.6。 我们公司的电脑在任何时候都不能连接外网,但是希望将一些开源的仓库移植到内网的服务器来。一是有相关代码使用的需求,二是可以建设一个内网能够查阅的…...
Linux文本处理三剑客(详解)
一、文本三剑客是什么? 1. 对于接触过Linux操作系统的人来说,应该都听过说Linux中的文本三剑客吧,即awk、grep、sed,也是必须要掌握的Linux命令之一,三者都是用来处理文本的,但侧重点各不相同,a…...
AI在线UI代码生成,不需要敲一行代码,聊聊天,上传图片,就能生成前端页面的开发神器
ioDraw的在线UI代码生成器是一款开发神器,它可以让您在无需编写一行代码的情况下创建前端页面。 主要优势: 1、极简操作:只需聊天或上传图片,即可生成响应式的Tailwind CSS代码。 2、节省时间:自动生成代码可以节省大…...
go-zero整合单机版ClickHouse并实现增删改查
go-zero整合单机版ClickHouse并实现增删改查 本教程基于go-zero微服务入门教程,项目工程结构同上一个教程。 本教程主要实现go-zero框架整合单机版ClickHouse,并暴露接口实现对ClickHouse数据的增删改查。 go-zero微服务入门教程:https://b…...
行政工作如何提高效率?桌面备忘录便签软件哪个好
在行政管理工作中,效率的提高无疑是每个行政人员都追求的目标。而随着科技的发展,各种便捷的工具也应运而生,其中桌面备忘录便签软件便是其中的佼佼者。那么,这类软件又如何帮助我们提高工作效率呢? 首先,…...
利用向日葵和微信/腾讯会议实现LabVIEW远程开发
利用向日葵远程控制软件结合微信或腾讯会议的视频通话功能,可以实现LabVIEW的远程开发和调试。通过向日葵进行远程桌面访问,配合视频通话工具进行实时沟通与问题解决,不仅提高了开发效率,还减少了地域限制带来的不便。介绍这种远程…...
SpringBoot 单元测试 指定 环境
如上图所示,在配置窗口中添加--spring.profiles.activedev,就可以了。...
Flutter 中的 SliverOpacity 小部件:全面指南
Flutter 中的 SliverOpacity 小部件:全面指南 Flutter 是一个功能强大的 UI 框架,由 Google 开发,允许开发者使用 Dart 语言来构建高性能、美观的跨平台应用。在 Flutter 的滚动组件体系中,SliverOpacity 是一个用来为其子 Slive…...
源码分析の前言
源码分析路线图: 初级部分:ArrayList->LinkedList->Vector->HashMap(红黑树数据结构,如何翻转,变色,手写红黑树)->ConcurrentHashMap 中级部分:Spring->Spring MVC->Spring Boot->M…...
接口性能测试复盘:解决JMeter超时问题的实践
在优化接口并重新投入市场后,我们面临着一项关键任务:确保其在高压环境下稳定运行。于是,我们启动了一轮针对该接口的性能压力测试,利用JMeter工具模拟高负载场景。然而,在测试进行约一分钟之后,频繁出现了…...
[数据集][目标检测]猕猴桃检测数据集VOC+YOLO格式1838张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1838 标注数量(xml文件个数):1838 标注数量(txt文件个数):1838 标注…...
摸鱼大数据——Hive函数7-9
7、日期时间函数 Hive函数链接:LanguageManual UDF - Apache Hive - Apache Software Foundation SimpleDateFormat (Java Platform SE 8 ) current_timestamp: 获取时间原点到现在的秒/毫秒,底层自动转换方便查看的日期格式 常用 to_date: 字符串格式时间…...
python连接数据库
python连接MYSQL、postgres、oracle等的基本操作 python连接mysql MySQLdb MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 的一个驱动,很多框架都也是基于此库进行开发,只支持 Python2.x,而且安装的时候有很多前置条件&#…...
能不能接受这些坑?买电车前一定要看
图片来源:汽车之家 文 | Auto芯球 作者 | 雷慢 刚有个朋友告诉我,买了电车后感觉被骗了, 很多“坑”都是他买车后才知道的。 不提前研究,不做功课,放着我这个老司机不请教, 这个大冤种他不当谁当&…...
k8s中pod如何排错?
排除Kubernetes Pod故障通常涉及一系列步骤,以诊断问题并找到解决方案。以下是一些常见的故障排除方法: 检查Pod状态: 使用kubectl get pods查看Pod的状态。如果Pod没有处于Running状态,查看更详细的信息,使用kubectl describe …...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
