字符编码讲解(C#)

news2024/12/13 2:50:04

在学习和编码的过程中,极容易遇到如下概念,他们有些是字符编码,有些是涉及的相关概念,接下来我将围绕下面的熟悉又陌生的概念做详细解释,并且梳理其之间的关系

UTF8, Unicode ,ASCII, UTF16 , UTF32 ,GB2312, GBK , GB18030 ,ANSI,BIG5

常见字符编码

ASCII

我们都知道,无论是什么样的数据或者是指令,在最后和计算机打交道的时候都是0和1这样二进制的方式,而对于人类来说,尤其是发明计算机的那群美国佬来说,看不懂011010101001011000这些指令,而要让计算机处理计算我们人类想要的数据,首先人类得看懂啊(不然人类无法给机器下达指令)。所以就有了ASCII——>

ASCII(American Standard Code for Information Interchange):美国信息交换标准代码,包括了英文、符号等。

可以理解为一种复杂的摩斯编码(通过.━ 的方式来编码传递信息)。也可以理解为一种映射关系,。比方说字母"a", 将其映射为97 ,用计算机算一下

"a",就是97 ,也是01100001,也是61,也是141,只是表示的进制不同,而对于电脑来说,二进制就是01100001 ,其映射为人类的语言就是“a”。美国人日常使用也就大小写英文字母和一些符号,足够了。计算机处理的最小单位是字节,一个字节也就是8比特,2的八次方是256,也就是说,一个字节可以表示256种不同的字符,而美国人用七七八八加起来就128个,256属实太多了,所以ASCII在编码的时候,最高位同统一为0 ,这样就是变成2的七次方,用来存储美国人日常所能用到的所有字符。

对于ASCII对应码表,感兴趣的可以卡查看对应表 ASCII码对照表,ASCII码一览表(非常详细) - C语言中文网

GB2312

上述说到对于美国佬来说,一个字节足够用来存储他们国家交流的一切信息。但是对于中国来说,太少了,完全不够用。于是中国自己也弄一套标准出来GB就是国标的缩写。


GB2312是最早一版的中文编码,每个字占据2bytes。由于要和ASCII兼容(尊重发明者),那这2bytes最高位不可以为0了(否则和ASCII会有冲突)。在GB2312中收录了6763个汉字以及682个特殊符号,已经囊括了生活中最常用的所有汉字。GB2312简体中文编码表 - 常用参考表对照表 - 脚本之家在线工具

GBK

上面所说的GB2312不太够用,六千多个汉字属实之恶能包含高频词汇,对于稍微偏僻的海曙不够用,就出来了BKG,国标扩展,里面有两万多个汉字等字符。一个中文字符用两个字节存储。(2的16次方为65,536)

GBK18030

汉字太多,只用2bytes表示一个字已经不够用了(2bytes最多只有65536种组合,然而为了和ASCII兼容,最高位不能为0就已经直接淘汰了一半的组合,只剩下3万多种组合无法满足全部汉字要求)。因此GB18030多出来的汉字使用4bytes编码。

附:中文编码的兼容性

Unicode字符集(万国码)

中国人有中国人的编码,印度人也有自己的编码,巴基斯坦也如此。那么世界就乱套了。对于10011001可能在GB2312中是一个汉字,而在巴基斯坦码的编码中变成了另一个,在国际化的交流中,是个头大的难题。于是国际组织制定了Unicode,万国码,把所有国家的字符全部收录进来,进行统一的字符编码,各自的国家就不要自己在那玩了,大家一起玩。

Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。

UTF-32

简单粗暴,奢侈!不管什么,全部四个字节表示。美国人就很麻烦,原来的“a”明明01100001就可以解决,用UTF-32得 00000000 00000000 00000000 01100001,太浪费了!

UTF-16

尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前65535个以外的字符。因此,就有了另外一种Unicode编码方式,叫做UTF-16(因为16位 = 2字节)。UTF-16将0–65535范围内的字符编码成2个字节,如果真的需要表达那些很少使用的"星芒层(astral plane)"内超过这65535范围的Unicode字符,则需要使用一些诡异的技巧来实现。UTF-16编码最明显的优点是它在空间效率上比UTF-32高两倍,因为每个字符只需要2个字节来存储(除去65535范围以外的),而不是UTF-32中的4个字节。并且,如果我们假设某个字符串不包含任何星芒层中的字符,那么我们依然可以在常数时间内找到其中的第N个字符,直到它不成立为止这总是一个不错的推断。

UTF-8

两个字概括: 伟大!

UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。英文字符、数字等只占1个字节(兼容标准ASCI编码),汉字字符占用3个字节。

在vscode 中,我强行把字符编码改为GB2312,韩文就显示不出来,会乱码

改回UTF-8后,正常显示

ANSI

准确说,并不存在哪种具体的编码方式叫做ANSI,它只是一个Windows操作系统上的别称而已。在中文简体Windows操作系统上,ANSI就是GBK;在泰语操作系统上,ANSI就是TIS-620(一种泰语编码);在韩语操作系统上,ANSI就是EUC-KR(一种韩语编码)。并且所谓的ANSI只存在于Windows操作系统上。

查看系统默认编码 :win+r打开cmd ——> chcp ——>可以查看code page的值 ,936

936就是简体中文,GB2312

BIG5

BIG5 是中国台湾使用的繁体的一套编码。其codePage为 950

在C#中可以通过EncodingInfo类 , Encoding.GetEncodings()方法获取所有不同的编码。

EncodingInfo 类 (System.Text) | Microsoft Learn

参考资料

结合相关资料总结,如有侵权,联系删除

C# 小叙 Encoding (一) - 哭过的天空 - 博客园

ANSI是什么编码?-CSDN博客

GB2312、GB18030、GBK、UNICODE、BI  G5之间兼容关系_gb180030能够显示big5吗-CSDN博客

字符集和字符编码(Charset & Encoding) - 吴秦 - 博客园

GB2312、GB18030、GBK、UNICODE、BI  G5之间兼容关系_gb180030能够显示big5吗-CSDN博客

文章推荐程序员必备:彻底弄懂常见的7种中文字符编码 - 知乎

还是云里雾里的小伙伴,强推一个视频

一听就懂字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题的讲解_哔哩哔哩_bilibili

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

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

相关文章

Mac备忘录表格中换行(`Option` + `Return`(回车键))

在Mac的ARM架构设备上,如果你使用的是Apple的原生“备忘录”应用来创建表格,换行操作可以通过以下步骤来实现: 在单元格中换行: 双击你想要编辑的单元格你可以输入文本,按Option(⌥) Enter来插…

Windows中将springboot项目运行到docker的容器中

0,先打包好项目,再启动docker 1,在Java项目根目录下创建一个名为Dockerfile的文件(没有扩展名),并添加以下内容。 # 使用OpenJDK的基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app# 将项…

HBU深度学习实验14.5-循环神经网络(1.5)

梯度爆炸实验 造成简单循环网络较难建模长程依赖问题的原因有两个:梯度爆炸和梯度消失。一般来讲,循环网络的梯度爆炸问题比较容易解决,一般通过权重衰减或梯度截断可以较好地来避免;对于梯度消失问题,更加有效的方式…

ZED相机应用

下载SDK wget https://stereolabs.sfo2.cdn.digitaloceanspaces.com/zedsdk/3.6/ZED_SDK_Ubuntu18_cuda11.5_v3.6.5.run 安装 ./ZED_SDK_Ubuntu18_cuda11.5_v3.6.5.run skip_python 测试 cd /usr/local/zed/tools ls ZED_Calibration ZED_Depth_Viewer ZED_Diagnostic ZED_E…

伟测科技再融资11.75亿:增收不增利,毛利率近年来持续下滑

《港湾商业观察》施子夫 王璐 12月9日,上海证券交易所上市审核委员会召开2024年第34次上市审核委员会审议会议,审议上海伟测半导体科技股份有限公司(再融资)(以下简称,伟测科技;688372.SH)事项。 今年8月…

Java爬虫设计:淘宝商品详情接口数据获取

1. 概述 淘宝商品详情接口(如Taobao.item_get)允许开发者通过编程方式,以JSON格式实时获取淘宝商品的详细信息,包括商品标题、价格、销量等。本文档将介绍如何设计一个Java爬虫来获取这些数据。 2. 准备工作 在开始之前&#x…

如何绕过IP禁令

网站、游戏和应用程序可以屏蔽特定IP地址,从而阻止使用该IP地址的任何人访问其服务。这称为IP禁令。管理员可以出于多种原因(例如发出过多请求或可疑活动)屏蔽IP地址。但是,这些禁令会使收集数据或访问在线内容变得更加困难。 一…

AI生成不了复杂前端页面?也许有解决方案了

在2024年,编程成为了人工智能领域最热门的赛道。AI编程技术正以惊人的速度进步,但在生成前端页面方面,AI的能力还是饱受质疑。自从ScriptEcho平台上线以来,我们收到了不少用户的反馈,他们表示:“生成的页面…

支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布

2024年12月9日,人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括:数据源方面,API数据源和Excel数据源支持对字段类型和长度进行设置;图表方面,离线类地图支持自定义地理区域设置&#…

Ubuntu使用telnet连接时出现的错误:没有到主机的路由(能ping通但是还是报错)

Ubuntu使用telnet连接时出现的错误:没有到主机的路由(能ping通但是还是报错) 文章目录 Ubuntu使用telnet连接时出现的错误:没有到主机的路由(能ping通但是还是报错)0.环境1.检查是不是能ping通2.防火墙的问…

location重定向和nginx代理

文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 正向代理2.2.1 固定正向代理2.2.2 自动代理 2.3 反向代理2.3.1 负载均衡的算法2.3.2 负载均衡的特点2.3.…

C# 委托详解02(委托和事件单独开一篇)

上一篇仅仅简单通过代码,以及相关运行示例,对委托有了基本概念。这一篇侧重对委托的更加深入的理解。有问题欢迎评论。本人技术不高,也欢迎指正。 希望看完我能够解释清楚以下问题,而大家能够从中找到自己的答案。 什么是委托&a…

RPC设计--应用层缓冲区,TcpBuffer

为什么需要应用层的buffer 为了方便数据处理,从fd上直接读写然后做包的组装、拆解不够方便方便异步发送,将数据写到应用层buffer后即可返回,让epoll即event_loop去异步发送。提高发送效率,多个小包可合并发送 buffer 设计 可以…

Linux中vi和vim的区别详解

文章目录 Linux中vi和vim的区别详解一、引言二、vi和vim的起源与发展三、功能和特性1、语法高亮2、显示行号3、编辑模式4、可视化界面5、功能扩展6、插件支持 四、使用示例1、启动编辑器2、基本操作 五、总结 Linux中vi和vim的区别详解 一、引言 在Linux系统中,vi和…

阿里云服务器Linux(centos)系统安装nginx1.20.2

阿里云服务器Linux(centos)系统安装nginx1.20.2 1.安装依赖包 一共要安装4种依赖(基于c语言) yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.下载nginx安装包并解压安装包 nginx官网下载:http://nginx.org/en/do…

数据结构6.3--交换排序

目录 交换排序基本思想 1.冒泡排序 2.快速排序 2.1hoare版本 2.2挖坑法 2.3前后指针版本 交换排序基本思想 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾…

JAVA安全—SpringBoot框架MyBatis注入Thymeleaf模板注入

前言 之前我们讲了JAVA的一些组件安全,比如Log4j,fastjson。今天讲一下框架安全,就是这个也是比较常见的SpringBoot框架。 SpringBoot框架 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提…

备忘录模式的理解和实践

引言 在软件开发中,我们经常会遇到需要保存对象状态并在某个时间点恢复到该状态的需求。这种需求类似于我们平时说的“后悔药”,即允许用户撤销之前的操作,恢复到某个之前的状态。备忘录模式(Memento Pattern)正是为了…

STL——string剖析

STL——string剖析 文章目录 STL——string剖析1. C语言中的字符串2. 标准库中string的使用2.1 构造函数2.2 string的容量操作resize和reserve 2.3 string的增删查改插入操作push_back:insert: 删除操作pop_back:erase 查找操作findfind_firs…

Ubuntu24.04配置STMTrack

项目地址:https://github.com/fzh0917/STMTrack 一、安装 CUDA 参考链接: Ubuntu24.04配置DINO-Tracker Ubuntu多CUDA版本安装及切换 由于之前在其他项目中已经安装了 CUDA12.1,这次需要安装另一个版本。 1. 查看安装版本 按照 requireme…