当前位置: 首页 > 编程笔记 >

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

公冶宏深
2023-03-14
本文向大家介绍基于C#开发中的那些编码问题(详谈),包括了基于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#开发中的那些编码问题(详谈)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍微信开发中mysql字符编码问题,包括了微信开发中mysql字符编码问题的使用技巧和注意事项,需要的朋友参考一下 问题描述:获取code以后不能用ajax请求微信api数据。这个和ajax跨域访问有关系得到用户信息之后存到mysql,发现中文全部变成了??(乱码) 通过上网查阅了相关资料,判断问题根本原因是字符编码问题。 解决方案: 修改配置文件/etc/mysql/my.conf

  • 本文向大家介绍详谈PHP编码转换问题,包括了详谈PHP编码转换问题的使用技巧和注意事项,需要的朋友参考一下 最近恰好要用到unicode编码的转换,就去查了一下php的库函数,居然没找到一个函数可以对字符串进行Unicode的编码和解码!也罢,找不到的话就自己实现一下了。。。 Unicode和Utf-8编码的区别 Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是

  • 本文向大家介绍关于c#中单例模式的一些问题,包括了关于c#中单例模式的一些问题的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍了关于单例模式的一些问题,想学习C#单例模式的同学们可以看一看,还是有些帮助 c#中的单例模式 单例模式是指在设计一个类时,保证在运行期间只有一个实例对象,因为过多相同的实例对象会占用内存空间。 ##举个例子 1.声明一个静态的Class1类的变量来引用唯一的对象。

  • 本文向大家介绍基于python 取余问题(%)详解,包括了基于python 取余问题(%)详解的使用技巧和注意事项,需要的朋友参考一下 取余的公式: 余数=除数-被除数*商 python的的余数是按照整除(向下取整)得到的商来计算的。 取余问题主要分为 : 正数与正数,负数与负数,正数与负数 ,0 正数与正数 负数与负数 0 正数与负数 补充知识:python切片及负数下标 [a:b:c] 表示

  • #设计人的求职记录# #经常用什么样的设计流程/思维模型?设计原则? (34114)#遇到过体验最好/最差的产品是什么?简述原因。 #怎么去验证设计的合理性 1. 避免过于主观、惯性思维、立场的影响;但部分的主观还是有必要的,毕竟不是编程。 2. 定性测试:访谈、评论、定性问卷 3. 定量测试:埋点数据的,统计分析的;AB测试,对比试验;用户反馈的量化数据,问卷 #你接下来的学习计划是什么样的?

  • 本文向大家介绍基于C++中setiosflags()的用法详解,包括了基于C++中setiosflags()的用法详解的使用技巧和注意事项,需要的朋友参考一下 cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2); setiosflags 是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是执