当前位置: 首页 > news >正文

常见的几种编码方式

常见的编码方式及其特点:

编码方式的设计是为了适应不同的字符集和应用需求,因此它们在表示字符时使用的位数和字节数各不相同

  1. 常见编码方式及其位数和字节数

    • 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可以编码中文,而其他的编码方式不行?

原理解释:

  1. ASCII:只有128个字符,不可能表示中文这样的复杂字符。

  2. ISO 8859-1:扩展到256个字符,但主要用于西欧语言字符,不包括中文。

  3. GB2312 和 BIG5:这两种编码方式是专门为中文设计的,但它们有各自的局限性,不能表示所有的中文字符。

  4. Unicode:它是一个统一的编码标准,包含了全球所有已知的字符。Unicode为每个字符分配一个唯一的编码点(code point),例如“中”字的编码点是U+4E2D。

  5. 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 的设计

  1. 字节序列容器

    • std::string 本质上是一个字节序列的容器,可以存储任意的字节数据。
    • 它不关心这些字节数据的具体含义,这使得它可以存储不同编码的字符串。
  2. 字符编码无关性

    • std::string 并不强制要求字符串使用特定的编码。
    • 可以将任何编码的字符数据(如ASCII、UTF-8、ISO 8859-1等)存储在 std::string 中。
  3. 灵活的内存管理

    • 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::wstringstd::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

相关文章:

常见的几种编码方式

常见的编码方式及其特点&#xff1a; 编码方式的设计是为了适应不同的字符集和应用需求&#xff0c;因此它们在表示字符时使用的位数和字节数各不相同 常见编码方式及其位数和字节数 ASCII&#xff08;American Standard Code for Information Interchange&#xff09;&#x…...

ubuntu移动硬盘重命名

因为在ubuntu上移动硬盘的名字是中文的&#xff0c;所以想要改成英文的。 我的方法&#xff1a; 将移动硬盘插到windows上&#xff0c;直接右键重命名。再插到ubuntu上名字就改变了。 别人的方法&#xff1a; ubuntu下如何修改U盘名字-腾讯云开发者社区-腾讯云 在自带的软件…...

VUE框架前置知识总结

一、前言 在学习vue框架中&#xff0c;总是有些知识不是很熟悉&#xff0c;又不想系统的学习JS&#xff0c;因为学习成本太大了&#xff0c;所以用到什么知识就学习什么知识。此文档就用于记录零散的知识点。主要是还是针对与ES6规范的JS知识点。 以下实验环境都是在windows环…...

张宇1000题80%不会?别急,这个方法肯定有用!

这太正常了&#xff0c;1000题的难度本来就高&#xff0c;不要慌 我考研的时候跟的也是张宇老师&#xff0c;但是1000题我根本就没做几道题就给换成880题660题了&#xff0c;而且只是强化阶段用880题&#xff0c;基础阶段我用的都是汤家凤的1800题。 不要担心做的不是张宇老师…...

【python】爬虫记录每小时金价

数据来源&#xff1a; https://www.cngold.org/img_date/ 因为这个网站是数据随时变动的&#xff0c;用requests、BeautifulSoup的方式解析html的话&#xff0c;数据的位置显示的是“--”&#xff0c;并不能取到数据。 所以采用webdriver访问网站&#xff0c;然后从界面上获取…...

一行命令将已克隆的本地Git仓库推送到内网服务器

一、需求背景 我们公司用gitea搭建了一个git服务器&#xff0c;其中支持win7的最高版本是v1.20.6。 我们公司的电脑在任何时候都不能连接外网&#xff0c;但是希望将一些开源的仓库移植到内网的服务器来。一是有相关代码使用的需求&#xff0c;二是可以建设一个内网能够查阅的…...

Linux文本处理三剑客(详解)

一、文本三剑客是什么&#xff1f; 1. 对于接触过Linux操作系统的人来说&#xff0c;应该都听过说Linux中的文本三剑客吧&#xff0c;即awk、grep、sed&#xff0c;也是必须要掌握的Linux命令之一&#xff0c;三者都是用来处理文本的&#xff0c;但侧重点各不相同&#xff0c;a…...

AI在线UI代码生成,不需要敲一行代码,聊聊天,上传图片,就能生成前端页面的开发神器

ioDraw的在线UI代码生成器是一款开发神器&#xff0c;它可以让您在无需编写一行代码的情况下创建前端页面。 主要优势&#xff1a; 1、极简操作&#xff1a;只需聊天或上传图片&#xff0c;即可生成响应式的Tailwind CSS代码。 2、节省时间&#xff1a;自动生成代码可以节省大…...

go-zero整合单机版ClickHouse并实现增删改查

go-zero整合单机版ClickHouse并实现增删改查 本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 本教程主要实现go-zero框架整合单机版ClickHouse&#xff0c;并暴露接口实现对ClickHouse数据的增删改查。 go-zero微服务入门教程&#xff1a;https://b…...

行政工作如何提高效率?桌面备忘录便签软件哪个好

在行政管理工作中&#xff0c;效率的提高无疑是每个行政人员都追求的目标。而随着科技的发展&#xff0c;各种便捷的工具也应运而生&#xff0c;其中桌面备忘录便签软件便是其中的佼佼者。那么&#xff0c;这类软件又如何帮助我们提高工作效率呢&#xff1f; 首先&#xff0c;…...

利用向日葵和微信/腾讯会议实现LabVIEW远程开发

利用向日葵远程控制软件结合微信或腾讯会议的视频通话功能&#xff0c;可以实现LabVIEW的远程开发和调试。通过向日葵进行远程桌面访问&#xff0c;配合视频通话工具进行实时沟通与问题解决&#xff0c;不仅提高了开发效率&#xff0c;还减少了地域限制带来的不便。介绍这种远程…...

SpringBoot 单元测试 指定 环境

如上图所示&#xff0c;在配置窗口中添加--spring.profiles.activedev&#xff0c;就可以了。...

Flutter 中的 SliverOpacity 小部件:全面指南

Flutter 中的 SliverOpacity 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;由 Google 开发&#xff0c;允许开发者使用 Dart 语言来构建高性能、美观的跨平台应用。在 Flutter 的滚动组件体系中&#xff0c;SliverOpacity 是一个用来为其子 Slive…...

源码分析の前言

源码分析路线图&#xff1a; 初级部分&#xff1a;ArrayList->LinkedList->Vector->HashMap(红黑树数据结构&#xff0c;如何翻转&#xff0c;变色&#xff0c;手写红黑树)->ConcurrentHashMap 中级部分&#xff1a;Spring->Spring MVC->Spring Boot->M…...

接口性能测试复盘:解决JMeter超时问题的实践

在优化接口并重新投入市场后&#xff0c;我们面临着一项关键任务&#xff1a;确保其在高压环境下稳定运行。于是&#xff0c;我们启动了一轮针对该接口的性能压力测试&#xff0c;利用JMeter工具模拟高负载场景。然而&#xff0c;在测试进行约一分钟之后&#xff0c;频繁出现了…...

[数据集][目标检测]猕猴桃检测数据集VOC+YOLO格式1838张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1838 标注数量(xml文件个数)&#xff1a;1838 标注数量(txt文件个数)&#xff1a;1838 标注…...

摸鱼大数据——Hive函数7-9

7、日期时间函数 Hive函数链接&#xff1a;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 &#xff0c;是 Python 连接 MySQL 的一个驱动&#xff0c;很多框架都也是基于此库进行开发&#xff0c;只支持 Python2.x&#xff0c;而且安装的时候有很多前置条件&#…...

能不能接受这些坑?买电车前一定要看

图片来源&#xff1a;汽车之家 文 | Auto芯球 作者 | 雷慢 刚有个朋友告诉我&#xff0c;买了电车后感觉被骗了&#xff0c; 很多“坑”都是他买车后才知道的。 不提前研究&#xff0c;不做功课&#xff0c;放着我这个老司机不请教&#xff0c; 这个大冤种他不当谁当&…...

k8s中pod如何排错?

排除Kubernetes Pod故障通常涉及一系列步骤&#xff0c;以诊断问题并找到解决方案。以下是一些常见的故障排除方法&#xff1a; 检查Pod状态: 使用kubectl get pods查看Pod的状态。如果Pod没有处于Running状态&#xff0c;查看更详细的信息&#xff0c;使用kubectl describe …...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

day51 python CBAM注意力

目录 一、CBAM 模块简介 二、CBAM 模块的实现 &#xff08;一&#xff09;通道注意力模块 &#xff08;二&#xff09;空间注意力模块 &#xff08;三&#xff09;CBAM 模块的组合 三、CBAM 模块的特性 四、CBAM 模块在 CNN 中的应用 一、CBAM 模块简介 在之前的探索中…...

从数据报表到决策大脑:AI重构电商决策链条

在传统电商运营中&#xff0c;决策链条往往止步于“数据报表层”&#xff1a;BI工具整合历史数据&#xff0c;生成滞后一周甚至更久的销售分析&#xff0c;运营团队凭经验预判需求。当爆款突然断货、促销库存积压时&#xff0c;企业才惊觉标准化BI的决策时差正成为增长瓶颈。 一…...