C#与C++交互(2)——ANSI、UTF8、Unicode文本编码

news2024/11/22 15:24:52

【前言】

我们知道计算机上只会存储二进制的数据,无论文本、图片、音频、视频等,当我们将其保存在计算机上时,都会被转成二进制的。我们打开查看的时候,二进制数据又被转成我们看得懂的信息。如何将计算机上的二进制数据转为我们看得懂的文本、图片等,就涉及到编码规则,即二进制数据与我们看的懂的信息之间的映射关系。我们这里讨论的是文本编码规则,有ANSI、ASCII、UTF-8、Unicode等。

【ASCII】

ASCII是编程首先会接触到的,其全名是American Standard Code for Information Interchange, 叫做“美国信息交换标准码”。现代计算机技术是从英文国家兴起的,最初的文本的内容只涉及26个英文、10个数字,一些行业常用字符等,加起来凑一凑到了128个。128个字符的集合就是ASCII字符集。128个在二进制中就需要7bit来区分。但计算机中最低要一个字节,即8bit。因此ASCII的最高位为0,空着不用。ASCII码中,一个英文字母占一个字节的空间。

ASCII码图- sunsky303 - 博客园

 【ANSI】

随着计算机发展到其他国家,各个国家也需要有各自的字符集,在创建自己国家语言的字符集时必须要兼容已有的ASCII字符集。

有些国家的语言字符很少,不到128个,例如拉丁文,就直接把ASCII编码中没用到的最高位用上。

但对汉字来说,常用汉字有六千多个,再加上中文相关的图形字符等,这就需要两个字节来表示。

两个字节最多可以存储的字符数目是2的16次方,即65536个字符,足够其他语言使用了。同样的,对于韩文、日文也需要两个字节表示。

对于ASCII字符集中的字符仍然用一个字节表示,对于其他语言的字符用两个字节表示。例如在中文的GB2312的表示中,如果一个字节的最高位为0,表示这个字节是ASCII编码,如果最高位为1,那么表示其是双字节编码的首字节,与后面的一个字节一块进行编码。这就是ANSI字符集,其是对ASCII字符集的拓展。

在中文操作系统下,ANSI字符集的编码规则是GB2312;在日文操作系统下,编码规则是JIS。

GB2312编码中只收集了常用的汉字,没有生僻字,后来的GBK和GB18030收集了更多的字符。

【Unicode】

Ansi字符集的问题是如果一个文本是GBK编码的,那么在日文操作系统上无法正确显示中文,看到的会是乱码。因此,需要一个包含所有国家所有字符的字符集,这个字符集就是Unicode字符集。

其目前已经包括了十多万个字符,还在不断增加中。此时用3个字节建立映射关系就够了,但是计算机中没有24位的数字类型,所有还是要用4个字节来表示。

在Unicode中所有字符都用4个字节表示,UTF-32编码刚好用4个字节表示。

UTF-16编码是变长编码,前65536个字符用两个字节表示,其他字符用四个字节表示。通过判断一个字节的前几位是否为“11011”来区分一个字符使用两个字节,还是四个字节表示。

对于英文字母来说,其由最初的一个字节变成了UTF-32编码的4个字节和UTF-16编码的两个字节,还是存在空间浪费,采用UTF-8编码可以有效节省空间,其也是变长编码。

如果读取的一个字节的首位为0,表示这个字节有个对应的字符;如果读取的一个字节的首位为1,接着判断下一个bit,依次判断得到的结果为110,那么表示这个字节和解析来的字节一起有个对应的字符。依次类推,首个字节中前几位为1110,表示3个字节对应一个字符,11110表示4个字节对应一个字符,如下图所示。

【其他】

一般来说UTF-8应用是最广泛的。在C#中,文本默认是UTF-16编码,一个字符对应两个字节。(一个字符对应四个字节的情况在中英文语况很少遇到)。而在C++中默认是ANSI编码的。

从C++传递字符串给C#,如果字符串全是英文,可以直接传给C#,因为UTF-16兼容ANSI中的英文编码。如果是字符串中包含有中文,则在C#端就无法正确识别。需要先将字符串转成字节序列(即字节数组),再将ANSI字节序列转成Unicode字节序列,再将Unicode字节序列转成UTF-16或UTF-8编码的字符串。

注意,代码文件也是文本文件,也会有编码格式的问题,在VS中选择文件->高级保存选项可以修改代码文件的编码格式。

【参考】

ASCII码和ANSI码的区别_ansi ascii_斑驳的岁月的博客-CSDN博客

程序员必备:彻底弄懂常见的7种中文字符编码 - 知乎 (zhihu.com)

Unicode 编码及 UTF-32, UTF-16 和 UTF-8 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 实现 RecyclerView下拉刷新,SwipeRefreshLayout上拉加载

上拉、下拉的效果图如下&#xff1a; 使用步骤 1、在清单文件中添加依赖 implementation ‘com.android.support:recyclerview-v7:27.1.1’ implementation “androidx.swiperefreshlayout:swiperefreshlayout:1.0.0” 2、main布局 <LinearLayout xmlns:android"http…

洛阳Geotrust旗下有RapidSSL https证书吗

Geotrust是知名的CA认证机构&#xff0c;旗下的https数字证书产品众多&#xff0c;Geotrust的数字证书具有高度的兼容性和可信度&#xff0c;得到了全球用户的广泛认可和信赖。Geotrust是一家全球领先的数字证书颁发机构&#xff0c;提供多种数字证书服务&#xff0c;包括SSL证…

数据库作业(一)

建立一张表&#xff1a; 表里面有多个字段&#xff0c;每一个字段对应一种数据类型 注意&#xff1a;表名&#xff0c;字段名都要起的有意义 1、首先mysql -uroot -p 进入MySQL 2、选择一个数据库并使用 3、创建一张表定义多个字段使用所有数据类型&#xff0c;数字&…

汇川运动控制产品故障排查

针对汇川伺服产品&#xff08;IS600/IS620&#xff09;的基本检测和一些出现频率较高的故障进行检测判断方法&#xff0c;适用于服务人员在现场排查/判断机器故障时&#xff0c;准确定位问题。 一、简单故障排查 注1&#xff1a;接线错误&#xff1a;1、UVW相序是否正确&#…

微软创新项目Project Rumi:多模态AI项目助力理解人类意图

8月7日 消息:Project Rumi 是微软的一个项目&#xff0c;旨在通过解决大型语言模型&#xff08;LLM&#xff09;理解非语言线索和上下文细微差别的局限性&#xff0c;增强 LLM 的能力。 该项目将非语言线索融入基于提示的 LLM 交互中&#xff0c;以提高交流的质量。研究人员使…

【零基础??天速成 Java】Day2 - 初识面向对象

目录 前言 1. 可变参数的使用 2. 构造器 3. 包 1、包的创建 2、包的使用 3、包的命名规范 4、常用的包 5. 访问修饰符 6. 继承 7. super 关键字 8. 方法重写 Override 写在最后&#xff1a; 前言 我的 java 基础学习&#xff0c;跟的是韩顺平的 java 课程~ 本篇…

MySQL: Failed to Connect to MySQL at XXXX:3306 with user root

客户端连接MySQL服务器&#xff0c;报错&#xff1a; 解决方案&#xff1a; 没有让root用户远程登录&#xff0c;需要设置&#xff1b; 进入MySQL服务器&#xff0c;修改一下 # mysql -h localhost -uroot -P3306 -p12345678 mysql: [Warning] Using a password on the comm…

elk开启组件监控

elk开启组件监控 效果&#xff1a; logstash配置 /etc/logstash/logstash.yml rootnode1:~# grep -Ev "^#|^$" /etc/logstash/logstash.yml path.data: /var/lib/logstash path.logs: /var/log/logstash xpack.monitoring.enabled: true xpack.monitoring.elasti…

融云荣登36氪WISE2023「全球化最佳基础设施」榜单

8 月 17 日&#xff08;周四&#xff09;&#xff0c;融云将带来直播课-《北极星如何协助开发者排查问题与预警风险&#xff1f;》欢迎点击报名~ 7 月 25 日&#xff0c;由 36 氪主办的“WISE 2023 全球化价值大会”在上海举行。大会汇聚产业力量&#xff0c;广邀不同领域的从业…

技术 SEO: 初学者指南2023

在当今数字时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;对于网站的成功至关重要。无论你是个人博客、小型企业还是大型电子商务网站&#xff0c;通过优化你的技术方面&#xff0c;可以提升你的网站在搜索引擎结果页面上的排名&#xff0c;吸引更多的有针对性的访问…

优化团队沟通:应对成员间不和谐的策略

一、理解团队沟通的重要性 深入了解团队沟通的含义 团队沟通并不仅仅是团队成员之间的信息交换。它是一个更为复杂的过程&#xff0c;涉及到信息的解码、理解、反馈&#xff0c;以及相互之间的情绪表达和理解。一个高效的团队沟通环境是能够促进所有成员之间清晰、有效、及时…

使用 API Gateway Integrator 在 Quarkus 中实施适用于 AWS Lambda 的 OpenAPI

AWS API Gateway 集成使得使用符合 OpenAPI 标准的 Lambda Function 轻松实现 REST API。 关于开放API 它是一个 允许以标准方式描述 REST API 的规范。 OpenAPI规范 (OAS) 为 REST API 定义了与编程语言无关的标准接口描述。这使得人类和计算机都可以发现和理解服务的功能&am…

Javascript 从入门到精通之JavaScript属性

一、什么是属性? 属性是一个JavaScript对象关联的值。一个JavaScript对象是一个无序的性质集合&#xff0c;属性通常可以更改、添加和删除&#xff0c;但有些只读。 二、访问JavaScript属性 访问对象属性的语法是(3种表现形式): 第一种 objectName.property // person.ag…

哪种模式ip更适合你的爬虫项目?

作为一名爬虫程序员&#xff0c;对于数据的采集和抓取有着浓厚的兴趣。当谈到爬虫ip时&#xff0c;你可能会听说过两种常见的爬虫ip类型&#xff1a;Socks5爬虫ip和HTTP爬虫ip。但到底哪一种在你的爬虫项目中更适合呢&#xff1f;本文将帮助你进行比较和选择。 首先&#xff0c…

CompletableFuture基本概念及用法

CompletableFuture继承于java.util.concurrent.Future&#xff0c;它本身具备Future的所有特性&#xff0c;并且基于JDK1.8的流式编程以及Lambda表达式等实现一元操作符、异步回调以及事件驱动编程的异步类&#xff0c;可以用来实现多线程的串行关系&#xff0c;并行关系&#…

I.MX6ULL_Linux_驱动篇(45)linux INPUT子系统

按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c; Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框 架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如按键值、…

Zotero+坚果云解决存储空间不足

Zotero实现同步有三种思路&#xff1a;①zotero自带同步&#xff08;文件同步方式选择Zotero&#xff09;&#xff1b;②zotfile坚果云网盘同步&#xff1b;③zotero选项勾选文件同步坚果云WebDAV同步。由于第一种只有300M使用空间&#xff0c;使用一段时间就会提示存储空间不足…

动态规划(用空间换时间的算法)原理逻辑代码超详细!参考自《算法导论》

动态规划&#xff08;用空间换时间的算法&#xff09;-实例说明和用法详解 动态规划&#xff08;DP&#xff09;思想实例说明钢条切割问题矩阵链乘法问题 应用满足的条件和场景 本篇博客以《算法导论》第15章动态规划算法为本背景&#xff0c;大量引用书中内容和实例&#xff0…

【枚举,构造】CF1582 C D

Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 思路很简单&#xff0c;只删除一种&#xff0c;直接枚举删除的是哪一种即可 但是回文子序列的判定我vp的时候写的很答辩&#xff0c;也不知道为什么当时要从中间往两边扫&#xff0c;纯纯自找麻烦 然后就越改越…

题解:散列查找(拉链法)出现冲突时,在散列表冲突点向外延伸一条链表(单链表),怎么使用memset函数

一、链接 840. 模拟散列表 二、题目 维护一个集合&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 xx&#xff1b;Q x&#xff0c;询问数 xx 是否在集合中出现过&#xff1b; 现在要进行 NN 次操作&#xff0c;对于每个询问操作输出对应的结果。 输…