C#中字符串编码处理
发布时间:2023-10-03 09:56:12
GB2312是简体中文系统的标准编码 用“区” 跟“位”的概念表示 称之为区位码
区指代大的范围 位相当于偏移量。
每个汉字占两个字节
高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE。
它的规律好像是按拼音a到z的顺序排列的
“啊”字是GB2312之中的第一个汉字,它的区位码就是1601
为此我们现在用代码的方式输出一个汉字
c#下是little字节序 b0跑后面去了。
ushort u = 0xa1b0;
byte[] chs =BitConverter.GetBytes(u);
Console.Write(Encoding.GetEncoding("GB2312").GetString(chs));
屏幕上输出的是汉字“啊”
但是注意并不代表 写个循环从0xbA1 到0xf7fe就可以输出所有的汉字,这个很简单比如高位从1到9 低位从1到9 只有81种组合。
并不代表99-11就是结果 这么二的问题 晕。实际上通过这种方式汉字的个数总共是6768个,理解了区位码的概念后你就知道怎样去处理gb2312的汉字编码了。
下面我们就用这种方式来输出所有的汉字
//gb2312
//B0-F7,低字节从A1-FE
//byte hi = 0xB0;
//byte lo = 0xA1;
for (byte i = 0xB0; i <= 0xF7; i++)
{
for (byte j = 0xA1; j <= 0xFE; j++)
{
//byte t = (byte)(j | (byte)0x01);
Console.Write(Encoding.GetEncoding("GB2312").GetString(new byte[] { i, j }));
}
}
关于GB2312的解释:https://www.jb51.net/article/34630.htm
ASCII是美国信息交换标准码 他是从0~127,一个字节8位最高是255 就是说一个字节都用不完。
GB2312里也有字母 称之为全角字符 ,gb2312里也包括ascii码称之为半角字符。
全角字符看上去怪怪的 感觉有点不一样 就像这样 全角: A半角:A 全角:a 半角:a
全角字符除了在文字系统里用到没什么实际作用。
全角字符的第一个字节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。
如半角A为65,则全角A则是163(第一个字节)、193(第二个字节,128+65)。
知道这个规律 那么我们也可以遍历处所有ascii对应的全角字符:
/**
*实际上,全角字符的第一个字节总是被置为163,
*而第二个字节则是相同半角字符码加上128(不包括空格)。
*如半角A为65,则全角A则是163(第一个字节)、193(第二个字节,128+65)。
*/
for (byte k = 0x00; k < 0x7f; k++)
{
byte[] ch = new byte[2];
ch[0] = 163;
ch[1] = (byte)(128 + k);
Console.Write(Encoding.GetEncoding("GB2312").GetString(ch));
}
winXp下文本文件默认的保存编码是ansi ,注意 这个ansi 他的概念跟GB2312又有不同,除此之外还有unicode 、utf-8
他们之间的关系是:
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。
这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。
在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码
C#进行文本读取时新同学最容易出现不理解为什么文本文件读取时是乱码
StreamReader sr = new StreamReader(Application.StartupPath + @"\config.txt");
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
因为读取的方式 也就是解码的方式跟文本存储时不一样,所以初始化streamReader时最好指定编码,Default即ANSI
StreamReader sr = new StreamReader(Application.StartupPath + @"\config.txt", System.Text.Encoding.Default);


猜你喜欢
- 最近在做Android 应用开发,IDE是android studio , 使用的版本配置如下:compileSdk 32bui
- Maven工程pom定义jdk版本今天把之前做的项目导进eclipse,然后发现报错,一些类在1.6中不支持,需要将JDK版本设置为1.7,
- 自定义控件是根据自己的需要自己来编写控件。安卓自带的控件有时候无法满足你的需求,这种时候,我们只能去自己去实现适合项目的控件。同时,安卓也允
- Java虚拟机栈概述Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,它的生命周期与线程相同。虚拟机栈
- 一、三方库介绍地址:https://github.com/youth5201314/banner介绍:从学习 Android 开始到现在工作
- 本文实例讲述了Java实现的不同图片居中剪裁生成同一尺寸缩略图功能。分享给大家供大家参考,具体如下:因为业务需要,写了这样一个简单类,希望能
- 注解说明使用注解: @PostConstruct效果:在Bean初始化之后(构造方法和@Autowired之后)执行指定操作。经常用在将构造
- 布局文件中的TextView属性<TextViewandroid:id="@+id/businesscardsingle_c
- IOS与网页JS交互随着移动APP的快速迭代开发趋势,越来越多的APP中嵌入了html网页,但在一些大中型APP中,尤其是电商类
- Excelapache 为 java开发者们提供了一套excel表格读写的工具:POI ,对于一个小白来说每次读写使用POI需要写一套复杂的
- Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念
- eureka获取服务ip和端口号进行Http调用我告诉你们为啥我要先从eureka首先获取 goods的服务ip, 在用ip的方式使用htt
- 前言最近在学习Kotlin这门语言,在项目开发中,运用到了单例模式。因为其表达方式与Java是不同的。所以对不同单例模式的实现进行了分别探讨
- 1、JDK1.8之前:假设有实体类User,里面有字段id,我们将相同id的User进行分组,并存放在Map中。(例子不是很恰当,但很能说明
- 如果说C#和C++有什么不同,博主不得不说,对于异步的支持程度是C#的一一个伟大的进步。
- 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,
- 本篇使用java自带的MessageDigest实现对文本的md5加密算法,具体代码如下: /** *@Description
- SpringMVC在接收集合请求参数时,需要在Controller方法的集合参数里前添加@RequestBody,而@RequestBody
- 【诞生背景】最近在做某配置中心的时候,配置中心采用properties格式进行配置的(如下图)。而我们工程的项目配置文件是yml格式的(如下
- 1.字节码增强技术字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。参考地址2.常见技术技术分类类型静态增强Asp