C#与C++交互(2)——ANSI、UTF8、Unicode文本编码
【前言】
我们知道计算机上只会存储二进制的数据,无论文本、图片、音频、视频等,当我们将其保存在计算机上时,都会被转成二进制的。我们打开查看的时候,二进制数据又被转成我们看得懂的信息。如何将计算机上的二进制数据转为我们看得懂的文本、图片等,就涉及到编码规则,即二进制数据与我们看的懂的信息之间的映射关系。我们这里讨论的是文本编码规则,有ANSI、ASCII、UTF-8、Unicode等。
【ASCII】
ASCII是编程首先会接触到的,其全名是American Standard Code for Information Interchange, 叫做“美国信息交换标准码”。现代计算机技术是从英文国家兴起的,最初的文本的内容只涉及26个英文、10个数字,一些行业常用字符等,加起来凑一凑到了128个。128个字符的集合就是ASCII字符集。128个在二进制中就需要7bit来区分。但计算机中最低要一个字节,即8bit。因此ASCII的最高位为0,空着不用。ASCII码中,一个英文字母占一个字节的空间。

【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 - 知乎
相关文章:
C#与C++交互(2)——ANSI、UTF8、Unicode文本编码
【前言】 我们知道计算机上只会存储二进制的数据,无论文本、图片、音频、视频等,当我们将其保存在计算机上时,都会被转成二进制的。我们打开查看的时候,二进制数据又被转成我们看得懂的信息。如何将计算机上的二进制数据转为我们…...
SQLSTATE[42000]: this is incompatible with sql_mode=only_full_group_by in
执行 SELECT *FROM test WHERE id>1 GROUP BY name having AVG(age)>10 ORDER BY id desc limit 1 提示错误 Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause…...
企业权限管理(五)-订单分页
订单分页查询 PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。 PageHelper使用 集成 引入分页插件有下面2种方式,推荐使用 Maven …...
Blender如何给fbx模型添加材质贴图并导出带有材质贴图的模型
推荐:使用 NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景 此教程适合新手用户,专业人士直接可直接绕路。 本教程中介绍了利用Blender建模软件,只需要简单几步就可以为模型添加材质贴,图,并且导出带有材质的模型文…...
MySQL不走索引的情况分析
未建立索引 当数据表没有设计相关索引时,查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…...
安装ubuntu22.04系统,配置国内源以及ssh远程登录
一、安装ubuntu22.04系统 原文连接:Ubuntu操作系统22.04版本安装教程-VMware虚拟机_wx63f86e949a470的技术博客_51CTO博客 1.点击界面左侧的开启此虚拟机,即可进入Ubuntu操作系统安装界面,点击Try or Install Ubuntu 即可开始安装 …...
win10 安装ubuntu子系统并安装宝塔
1、安装子系统 2、ubuntu 中安装宝塔 这里需要注意的: 大部分文章上写的是“面板账户登录信息”不能直接访问,要改成127.0.0.1:8888去访问。 这种情况适合“面板账户登录信息”端口就是8888。 想我的就是32757 这时你就要用 http://127.0.0…...
gazebo 导入从blender导出的dae等文件
背景: gazebo 模型库里的模型在我需要完成的任务中不够用,还是得从 solidworks、3DMax, blender这种建模软件里面在手动画一些,或者去他们的库里面在挖一挖。 目录 1 blender 1-1 blender 相关links 1-2 install 2 gazebo导入模型 2-1 g…...
目标检测YOLOv3基于DarkNet53模型测试-笔记
目标检测YOLOv3基于DarkNet53模型测试-笔记 预测和试测结果: 预测代码如下所示: testInsects.py #YOLOv3网模型测试-单图片文件测试并显示测试结果 import time import os import paddle import numpy as np import cv2 import random from PIL impor…...
Unity项目中查找所有使用某一张图片的材质球,再查找所有使用材质球的预设
废话少说,直接上代码。 using UnityEditor; using UnityEngine;public class FindDependencies : MonoBehaviour {static bool m_bIsSaveFile false;static TextWriteHelper m_szMaterialList new TextWriteHelper();static TextWriteHelper m_szPrefabList new…...
postman接口测试中文汉化教程
想必同学们对于接口测试工具postman的使用并不陌生,以及最近大为流行的国产工具apifox。对于使用过的同学来说,两者区别以及优缺点很容易别展示出来,postman相比apifox来说更加轻量,但是apifox更加符合国人的使用习惯....中国人给…...
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver的解决办法
springcloudAlibaba项目连接mysql时(mysql版本8.0.31,Springboot2.2.2,spring cloud Hoxton.SR1,spring cloud alibaba 2.1.0.RELEASE),驱动名称报红,配置如下: 原因:引入的jdbc驱动包和使用的m…...
认识所有权
专栏简介:本专栏作为Rust语言的入门级的文章,目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言,虽然历史没有C、和python历史悠远,但是它的优点可以说是非常的多,既继承了C运行速度,还拥有了Java…...
恒盛策略:怎样看k线图实图详解如何看懂k线图?
K线图是股票剖析中常用的一种图表,它能够反映一段时间内股票价格的变化状况,对于股票投资者来说非常重要。但是,由于k线图并不是很好理解,很多投资者并不知道怎样看懂它。那么,咱们就从多个视点来看看怎样看k线图实图&…...
物联网的定义、原理、示例、未来
什么是物联网? 物联网 (IoT) 是指由嵌入传感器、软件和网络连接的物理设备、车辆、电器和其他物理对象组成的网络,允许它们收集和共享数据。这些设备(也称为“智能对象”)的范围可以从简单的“智能家居”设备(如智能恒温器)到可穿戴设备(如智能手表和支持RFID的服…...
Vue 整合 Element UI 、路由嵌套和参数传递(五)
一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式,创建一个名为 hello-vue 的工程,命令为: # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化,记得一路的 no vue init webpack hello-vue 1.2 安装…...
Git全栈体系(四)
第七章 IDEA 集成 Git 一、配置 Git 忽略文件 1. Eclipse 特定文件 2. IDEA 特定文件 3. Maven 工程的 target 目录 4. 问题 4.1 为什么要忽略他们? 与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。 4.2 …...
数据结构初阶--二叉树的链式结构
目录 一.二叉树链式结构的概念 二.二叉树链式结构的功能实现 2.1.链式二叉树的定义 2.2.链式二叉树的构建 2.3.链式二叉树的遍历 2.3.1.先序遍历 2.3.2.中序遍历 2.3.3.后序遍历 2.3.4.层序遍历 2.4.链式二叉树的求二叉树的结点数量 法一:计数法 法二&a…...
Taro UI中的AtTabs
TaroUI 中的 AtTabs 是一个用于创建标签页(tab)组件的组件。它提供了一种简单的方式来切换显示不同的内容。 AtTabs 的使用方式如下: 首先,引入 AtTabs 组件和必要的样式: import { AtTabs, AtTabsPane } from taro-ui import taro-ui/dis…...
ChatGPT FAQ指南
问:chatgpt 国内不开放注册吗? OpenAI不允许大陆和香港用户注册访问 openai可以的,chatGPT不行 以下国家IP不支持使用 中国(包含港澳台) 俄罗斯 乌克兰 阿富汗 白俄罗斯 委内瑞拉 伊朗 埃及 问:ChatGPT和GPT-3什么关系? GPT-3是OpenAI推出的AI大语言模型 ChatGPT是在G…...
揭秘PostCSS Parser:从CSS文本到AST节点树的完整转换指南
揭秘PostCSS Parser:从CSS文本到AST节点树的完整转换指南 【免费下载链接】postcss Transforming styles with JS plugins 项目地址: https://gitcode.com/gh_mirrors/po/postcss PostCSS是一个强大的CSS处理工具,其核心功能之一就是通过Parser解…...
时间序列预测:Box-Jenkins方法与ARIMA模型实战指南
1. 时间序列预测与Box-Jenkins方法概述我第一次接触Box-Jenkins方法是在分析销售数据时遇到的难题。当时手头有3年的日销数据,需要预测未来半年的趋势。传统的移动平均法完全失效,而机器学习模型又显得"杀鸡用牛刀"。这时一位资深数据科学家推…...
Qwen3.5-2B数据库智能查询实战:自然语言转SQL语句
Qwen3.5-2B数据库智能查询实战:自然语言转SQL语句 1. 引言:当业务人员遇到数据库查询难题 市场部的王经理每周都要找IT部门要销售数据报表。"帮我查下上个月卖得最好的产品"、"看看华东区哪些客户三个月没下单了"——这些看似简单…...
新手避坑指南:用Python+uiautomator2写第一个安卓自动化脚本(附贴吧实战)
Pythonuiautomator2安卓自动化实战:从零编写贴吧签到脚本 第一次接触安卓自动化测试时,我盯着满屏的adb命令和陌生的Python库名发呆了半小时。直到在模拟器上看到机械臂自动完成贴吧签到、滑动浏览、点赞回帖的全过程,才意识到自动化脚本就像…...
哈希表实战指南:从冲突解决到性能优化的完整教程
哈希表实战指南:从冲突解决到性能优化的完整教程 【免费下载链接】interview 📚 C/C 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of…...
终极Vim ASCII艺术创作指南:从零开始的文本绘画之旅
终极Vim ASCII艺术创作指南:从零开始的文本绘画之旅 【免费下载链接】vim The official Vim repository 项目地址: https://gitcode.com/gh_mirrors/vi/vim Vim作为一款强大的文本编辑器,不仅能高效处理代码,还能成为创作ASCII艺术的利…...
终极jq数据质量检测指南:如何快速发现和修复JSON问题
终极jq数据质量检测指南:如何快速发现和修复JSON问题 【免费下载链接】jq Command-line JSON processor 项目地址: https://gitcode.com/GitHub_Trending/jq/jq jq是一款轻量级且灵活的命令行JSON处理器,类似于sed、awk、grep等工具,但…...
Qwen3-ASR-1.7B部署案例:图书馆有声书资源→可检索文本数据库
Qwen3-ASR-1.7B部署案例:图书馆有声书资源→可检索文本数据库 想象一下,图书馆里堆积如山的磁带、CD和数字音频资源,如何让这些宝贵的有声内容变得可搜索、可索引?传统的人工转录方式耗时耗力,而现代语音识别技术正在彻…...
AI工作流引擎:用DAG编排框架提升AI应用开发效率
1. 项目概述:一个面向AI应用开发的现代工作流工具如果你最近在折腾AI应用开发,无论是想快速搭建一个智能对话机器人,还是想把大语言模型(LLM)的能力集成到你的业务系统里,大概率会遇到一个共同的烦恼&#…...
R语言快速验证机器学习算法的实战指南
## 1. 为什么需要快速验证机器学习算法在数据科学项目初期,我们常面临算法选择的困境。我经手过的十几个工业级项目中,团队平均会花费23%的时间在算法选型上。R语言作为统计计算的首选工具,其丰富的机器学习算法库让我们能在几分钟内完成多种…...
