6-字符编码
本篇博客对应视频讲解
回顾
上一篇讲了文件相关的操作,更为详细的内容也给出了官方的链接。讲完之后,大家应该要记得File
,Directory
这两个单词,分别是文件和目录的意思。
文件的操作主要也就是使用FileInfo
,DirectoryInfo
这两个类。还有个路径Path
类。
至于不同格式的文件如何处理,我们通常需要借助第三方类库去实现。
我们也说了,操作文件,尤其是读取和编辑写入,其实就是对不同编码的字符串进行操作。今天我们就来简单的说一下字符编码相关的内容。
字符编码
首先,我们还是要了解一下相关的概念: 官方链接:.NET 中编码的字符
编码的作用
我们都知道,计算机只识别0和1,所以,我们所使用的文字,一个数字、字母、汉字或其他的符号,最终还是要转换成0和1的形式。由于历史发展遗留问题,计算机开始只需要表示常用的数字和字母,那么使用很少的位和较简单的编码形式就可以做到,早期的计算机甚至无法显示中文。之后计算机成为最常见的设备,全世界的语言文字它都要能表示,在不断的发展过程中,就出现了很多编码方式来对字符编码,以支持不同的语言集。
所以,简单来讲,编码让我们可以在人类可识别的文字到计算机可处理的字符之间转换。同时也可以在不同国家文化的字符集转换。
使用编码
在实际编程过程中,我们会经常在文件处理和处理网络请求返回的数据时对数据来源进行编码判定和处理。
使用.Net,我们通常使用Eoncoding
类来进行编码相关的操作,不同的字符编码实质上是采用不同的字节组合来表示字符。这意味着我们想进行转换,就要将字符先转换成字节的表示形式,然后在字节层面上进行编码的转换,然后再将新的字节还原成字符的表现形式。
把不同编码的字符都可以转化为byte[]
,如果我们在不同的编码间进行转换,byte[]
就成为中间桥梁。
在C#中,byte类型表示0-255范围的数字,即更256个数字,也就是2^8个数字,即可以使用8位二进制表示,也正是一个字节的长度。通常来说byte是有字节的含义。而不同的字符编码是由多个字节组成的,所以我们在不同字符集间进行转换,需要通过字节去做中转。
我们今天的示例为: 创建一个GBK编码内容的文件,从中读取内容,转换成UTF8格式输出。
//创建文件,设置编码保存 string content = "编码"; string path = @"e:\output.txt"; // 更多的编码支持,需要先注册 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); //定义编码 var utf8 = Encoding.UTF8; var gbk = Encoding.GetEncoding("GBK"); Console.OutputEncoding = utf8; //以GBK编码保存文件 File.WriteAllText(path, content, gbk); //读取文件内容 string readContent = File.ReadAllText(path, gbk); // 不同编码的bytes输出 // 1 源字符转字节 var gbkBytes = gbk.GetBytes(readContent); Console.WriteLine("源文件字节"); Print(gbkBytes);// 177 224 194 235 // 2 编码转换,转换字节到新编码形式 var utf8Bytes = Encoding.Convert(gbk, utf8, gbkBytes); // 3 将新字节还原到目标编码 var utfContent = Encoding.UTF8.GetString(utf8Bytes); Console.WriteLine("utf8的字节:"); Print(Encoding.UTF8.GetBytes(utfContent));// 231 188 150 231 160 129 // 直接读字节 var binary = File.ReadAllBytes(path); Print(binary);
打印字节:
/// <summary> /// 输出字节形式 /// </summary> /// <param name="bytes"></param> static void Print(byte[] bytes) { foreach (var item in bytes) { Console.Write(item); Console.Write(" "); } Console.WriteLine(); }