首页 > 编程语言 >C++码表之Unicode

C++码表之Unicode

时间:2024-08-27 09:26:41浏览次数:13  
标签:字符 UTF 字节 编码 码表 C++ Unicode 编码方式

今日诗词:

折花逢驿使,寄与陇头人。

江南无所有,聊赠一枝春。

                                          ——《赠范晔诗》【南北朝】陆凯


引言:

上一期我们说到了ASCII码表,这是一种现如今不是那么通用的机制,随着计算机的普及,越来越多的人开始学习计算机,深入研究它,所以我们需要一种可以映射所有语言的码表,这就是Unicode编码。

正文:

小知识:

在开始今天的Unicode编码前,我先来说一个知识点,有助于后面地理解,看懂机制中代表的意思。

字节序:

一个字(32位机器采用32bits字长4bytes)在内存中存放的字节序是怎样的呢?

两个方法:

大端法:(big endition):大多数IBM机器,Internet传输

0x1000x1010x1020x103
01234567

小端法:(little endition):Intel兼容机

0x1000x1010x1020x103
67452301

这就是字节序的表示方法:大端法,小端法。


Unicode编码

Unicode编码,也被称为统一码、万国码或单一码,是一种在计算机上广泛使用的字符编码方案。它旨在解决传统字符编码方案的局限,为每种语言中的每个字符设定了统一且唯一的二进制编码,以满足跨语言、跨平台进行文本转换和处理的需求。
一、起源与发展
Unicode编码的历史可以追溯到20世纪60年代,当时计算机科学家们意识到不同计算机系统使用不同的字符编码方式,导致文本和数据在不同系统间传输时出现混乱和错误。为解决这一问题,国际组织开始致力于制定统一的字符编码标准。1987年,Unicode联盟成立,开始制定Unicode编码标准。该标准于1990年开始研发,1994年正式公布,并随着计算机和互联网的发展逐渐成为全球通用的字符编码标准。
二、特点与优势
1.统一性:Unicode为世界上几乎所有的字符集和符号提供了唯一的数字标识符,确保了字符在不同计算机系统和编程环境中的一致性和互操作性。
2.扩展性:Unicode编码体系庞大,能够容纳超过110万个码位,涵盖了全球范围内的绝大多数语言字符,为未来的字符扩展提供了充足的空间。
3.兼容性:Unicode与多种传统字符编码方案(如ISO 8859、GB2312等)保持兼容,使得旧有编码方式可以平滑过渡到Unicode编码。
三、实现方式
虽然Unicode为每个字符分配了唯一的码位,但其具体实现方式(如UTF-8、UTF-16、UTF-32等)在编码长度上有所不同:
1.UTF-8:一种可变长度的编码方式,能够根据字符的不同使用不同数量的字节进行编码。它对于ASCII字符非常高效且兼容,是互联网上最流行的字符编码方式之一。特点是存储效率高(不方便内部随机访问);无字节序问题(可作为外部编码);与ASCII码表完全互通。一个byte表示一个字符。
2.UTF-16:固定长度的编码方式,使用16位(即2个字节)来表示一个字符。在处理基本平面的字符时非常高效,但对于扩展平面的字符需要使用代理对(surrogate pair)来表示。特点是定长(方便内部随机访问);有字节序问题(不可作为外部编码)。两个byte表示一个字符。
3.UTF-32:也是固定长度的编码方式,使用32位(即4个字节)来表示一个字符。它简化了字符的编码和解码过程,但可能会占用更多的存储空间。特点是定长(方便内部随机访问);有字节序问题(不可作为外部编码)。两个byte表示一个字符。

四、应用领域
Unicode编码在多个领域发挥着重要作用,包括:

  1. 跨语言文本处理:使得不同语言的文本可以在同一平台上进行处理和交换。
  2. 国际化软件开发:确保软件支持多种语言,满足全球化市场的需求。
  3. 网络通信:确保各种语言的字符能够正确传输和显示,提高通信的效率和准确性。
  4. 数据库存储:为数据分析和挖掘提供更广泛的数据来源。
  5. 文本编辑器:在文档或文本文件中插入Unicode字符时,可以直接使用文本编辑器进行输入或粘贴。
  6. HTML和网页:在HTML中,可以使用实体编码或直接插入Unicode字符来表示特殊字符。

综上所述,Unicode编码作为一种重要的字符编码标准,为全球范围内的信息交流和处理提供了统一的基础。随着技术的不断发展和全球化的推进,Unicode编码将在更多领域发挥重要作用。


实例演示:

 首先我们在Notepad++中写一段字符串常量(helloworld),然后在编码中转换成不同的编码(这里有五种编码:ASCII码表,UTF-8编码,UTF-8-BOM编码,UTF-16 Big Endition编码,UTF-16 Little Endition编码),转化后的文件(五个)保存在一起方便使用。

 

 然后在资源管理器中打开这五个文件。然后选中其中一个文件点击右键就会出现打开方式的方框,找到二进制编辑器然后单击,就会出现着五种形式各自的二进制表示。

 我们看上图,其中3和4就是ASCII码表和UTF-8编码,这两个的二进制表示一摸一样,因为二者都是以8位来定义的,所以是通用的。然后是1和5,分别是UTF-16 Big Endition编码和UTF-16 Little Endition编码,它们之间的不同之处就是字节序的不同,其他都是相同的;相比于UTF-8编码,这两个在每一个数字都加了00。最后是UTF-8-BOM编码,这个可以忽略,因为八位的没有字节序,而BOM又是定义字节序的符号,所以在这就是多此一举。

最后说一句:编码错误的根本原因在于编码方式和解码方式的不统一(就是解铃还须系铃人)。所以当文件出现乱码情况,80%都是这个原因。这一章我讲解的比较简单,不够严谨规范,感兴趣的同学可以深入研究一下


标签:字符,UTF,字节,编码,码表,C++,Unicode,编码方式
From: https://blog.csdn.net/2301_81280642/article/details/141508040

相关文章

  • C++容器之字符串的详解
    每日诗词:我见青山我妩媚,料青山见我应如是。                             ——《贺新郎·甚矣吾衰矣》【宋】辛弃疾目录补漏:vector在分配新内存块后如何进行元素复制正文:字符串变量和常量字符串变量:解析:......
  • 学习C++的阶段总结
    每日诗词:盛气光引炉烟,素草寒生玉佩。应是天仙狂醉,乱把白云揉碎。                        ——《清平乐·画堂晨起》【唐】李白目录月末学习总结展望和感谢通知我的目标是:共同进步下期预告:搞定C++指针;更新时间:待定......
  • LeetCode 算法:爬楼梯 c++
    原题链接......
  • 信息学奥赛c++语言:判断能否被3,5,7整除
    题目描述给定一个整数,判断它能否被3,5,7整除,并输出以下信息:1、能同时被3,5,7整除(直接输出357,每个数中间一个空格);2、只能被其中两个数整除(输出两个数,小的在前,大的在后。例如:35或者37或者57,中间用空格分隔);3、只能被其中一个数整除(输出这个除数);4、不能被任何数整除,输出小写字符......
  • 【C++ 面试 - 内存管理】每日 3 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • c++学习
    心得1.字符串处理函数strcat(s1,s2)//将s2连接到s1后,并返回s1strncat(s1,s2)//只对s2的前n个字母进行操作strcpy(s1,s2)//将s2复制到s1strncpy(s1,s2)strcmp(s1,s2)//比较s1和s2的大小,若s1>s2,返回正整数;若s1=s2,返回0;若s1<s2,返回负整数;strncmp(s1,s2)strlen(s1)//......
  • C++实现的数独游戏
    数独游戏是什么数独(Sudoku)是一种基于数字的逻辑推理游戏,起源于18世纪的瑞士数学家莱昂哈德·欧拉(LeonhardEuler)的拉丁方阵,但现代数独的规则由美国架桥杂志在20世纪后半叶所推广,随后在日本得到了广泛流行,并被命名为“数独”(意为“数字独立”)。如今,数独已经成为一种在世界各......
  • C++ 设计模式——享元模式
    C++设计模式——享元模式C++设计模式——享元模式1.主要组成成分2.享元模式内部状态3.享元模式外部状态4.逐步构建享元模式4.1抽象享元类定义4.2具体享元类实现4.3享元工厂类实现4.4主函数5.享元模式UML图享元模式UML图解析6.享元模式的优点7.享元模......
  • 在 C/C++ 中使用 MY_API 宏封装动态库:一种高效的跨平台接口实现方法
    目录1.背景介绍2.MY_API宏的定义3.使用MY_API宏封装动态库4.编译和使用动态库5.结论在现代软件开发中,封装动态库(DynamicLinkLibrary,DLL)以提供可复用的功能模块已经成为一种常见的实践。然而,在开发跨平台库时,由于不同操作系统对于动态库的导出和导入机制有......
  • C++面向对象三大特性之一(继承)
    面向对象思维是编程中很重要的一个思维,众所周知面向对象编程有三大特性封装、继承、多态,今天我就来分享一下三大特性之一的继承。一、什么是继承?我们举例说明,比如你老爸的财产你可以使用,这就是继承,在面向对象中,体现为一个子类可以使用父类的成员属性和成员函数,自己不用在......