基于C#开发中的那些编码问题(详谈)

 更新时间:2017年11月22日 10:31:02   作者:龙葛格  
下面小编就为大家分享一篇基于C#开发中的那些编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近一直在搞各种编码问题,略有心得,与大家分享一番。

System.Text提供了Encoding的抽象类,这个类提供字符串编码的方法。常用的编码方式主要有ASCII,Unicode,UTF8(Unicode编码的一种)。

Unicode有四种编码格式,UTF-8, UTF-16,UTF-32,UTF-7。

字符编码类,ASCIIEncoding ,UTF7Encoding,UnicodeEncoding,UTF32Encoding。

下面对ASCII和Unicode编码进行对比,废话不说,先上代码:

这是ASCII编码、解码。

static void Main(string[] args)
  {
   string temp = "Hello World!";
   Console.WriteLine("Original String:{0}", temp);
   
   byte[] tempBytes = System.Text.Encoding.ASCII.GetBytes(temp);
   Console.WriteLine("Bytes Array:{0}", BitConverter.ToString(tempBytes));

   BigInteger integer = new BigInteger(tempBytes);
   Console.WriteLine("BigInteger:{0}", integer);

   string res = System.Text.Encoding.ASCII.GetString(tempBytes);
   Console.WriteLine("Convert Back String:{0}", res);
   Console.ReadKey();
  }

运行结果如下:

Original String:Hello World!
Bytes Array:48-65-6C-6C-6F-20-57-6F-72-6C-64-21
BigInteger:10334410032597741434076685640
Convert Back String:Hello World!

很正常,对吧?但是,如果输入的字符串是中文(或者其他非ASCII表中的字符),情况会怎么样呢?

改变上面的程序代码

string temp = "你好,世界!";

运行结果如下:

Original String:你好,世界!
Bytes Array:3F-3F-3F-3F-3F-3F
BigInteger:69540876599103
Convert Back String:??????

如果把编码格式换成UTF8,依然重复上面的测试过程。

static void Main(string[] args)
  {
   string temp = "你好,世界!";
   Console.WriteLine("Original String:{0}", temp);
   
   byte[] tempBytes = System.Text.Encoding.UTF8.GetBytes(temp);
   Console.WriteLine("Bytes Array:{0}", BitConverter.ToString(tempBytes));

   BigInteger integer = new BigInteger(tempBytes);
   Console.WriteLine("BigInteger:{0}", integer);

   string res = System.Text.Encoding.UTF8.GetString(tempBytes);
   Console.WriteLine("Convert Back String:{0}", res);
   Console.ReadKey();
  }

运行结果如下:

Original String:你好,世界!
Bytes Array:E4-BD-A0-E5-A5-BD-EF-BC-8C-E4-B8-96-E7-95-8C-EF-BC-81
BigInteger:-10998968812899434720462615123889939386679836
Convert Back String:你好,世界!
Original String:Hello World!
Bytes Array:48-65-6C-6C-6F-20-57-6F-72-6C-64-21
BigInteger:10334410032597741434076685640
Convert Back String:Hello World!

通过对比,我们发现除了兼容中文和其他语言外,似乎没有太大区别。如果把编码集换成Unicode,中英文字符编码的不同就会很容易看出来了。

Original String:Hello World!
Bytes Array:48-00-65-00-6C-00-6C-00-6F-00-20-00-57-00-6F-00-72-00-6C-00-64-00-21-00
BigInteger:3160918205608148134863399242437668999277801104545742920
Convert Back String:Hello World!
Original String:你好,世界!
Bytes Array:60-4F-7D-59-0C-FF-16-4E-4C-75-01-FF
BigInteger:-307722159543719876182061216
Convert Back String:你好,世界!

如果不考虑其他情况。通过对比结果,我们发现:

1、ASCII只能处理英文和英文符号,具体请参考ASCII字符表

2、Unicode可以处理全球所有语言符号

3、Unicode处理英文时,会在每个字节后面加一个字节0x00,比ASCII多出一倍的长度;处理中文时,编码较短。

4、UTF8处理中文时比Unicode编码长,处理英文时与ASCII一样。

结论,由于现在存储介质越来越不值钱,在处理有非英文字符时,编码格式应该选择Unicode(或其子集UTF8等的任意一种编码格式),只有在确定程序只会处理英文的时候,才能选择ASCII编码。

以上这篇基于C#开发中的那些编码问题(详谈)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C#如何在WinForm中打开Excel文件,或打开Excel应用显示数据

    C#如何在WinForm中打开Excel文件,或打开Excel应用显示数据

    这篇文章详细介绍了如何在WinForm中打开Excel文件,并提供了相关的代码解释、数据插入、单元格格式设置和页面格式设置的方法
    2024-12-12
  • C#使用Selenium+PhantomJS抓取数据

    C#使用Selenium+PhantomJS抓取数据

    本文主要介绍了C#使用Selenium+PhantomJS抓取数据的方法步骤,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 解析C#彩色图像灰度化算法的实现代码详解

    解析C#彩色图像灰度化算法的实现代码详解

    本篇文章是对C#中彩色图像灰度化算法的实现进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#使用Dll的几种方法示例

    C#使用Dll的几种方法示例

    使用 DLL(动态链接库)是 C# 开发中常见的任务之一,DLL 文件包含可以在运行时加载的代码和数据,允许程序共享功能和资源,降低程序的内存占用并促进代码的复用,本篇文章将深入探讨 C# 中使用 DLL 的多种方法,并提供相关代码示例,需要的朋友可以参考下
    2024-10-10
  • VS2012 未找到与约束ContractName匹配的导出

    VS2012 未找到与约束ContractName匹配的导出

    这篇文章主要介绍了在更新的windows补丁后,Visual Studio 用户可能无法打开或创建 C++ 或 JavaScript 文件或项目,小编的解决办法,希望可以帮助到大家
    2018-04-04
  • 一个可逆加密的类(使用3DES加密)

    一个可逆加密的类(使用3DES加密)

    表示三重数据加密标准算法的基类,TripleDES 的所有实现都必须从此基类派生。是从 SymmetricAlgorithm 类里继承出来。
    2011-07-07
  • c# 用ELMAH日志组件处理异常

    c# 用ELMAH日志组件处理异常

    这篇文章主要介绍了c# 用ELMAH日志组件处理异常,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-01-01
  • C#操作注册表之RegistryKey类

    C#操作注册表之RegistryKey类

    这篇文章介绍了C#操作注册表之RegistryKey类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C# Stack堆栈的使用方法

    C# Stack堆栈的使用方法

    最近打算学习下C# Stack堆栈的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2009-01-01
  • C#中DataTable和List互转的示例代码

    C#中DataTable和List互转的示例代码

    很多场景下,我们需要将List转换成为DataTable,本文主要介绍了C#中DataTable和List互转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论