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

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#开发中那些编码问题的更多相关文章

  1. Java开发中的编码分析__GET&POST

    GET方式提交参数分析 code.jsp <%@ page language="java" contentType="text/html; charset=UTF- ...

  2. WEB开发中的字符集和编码

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  4. Java应用开发中的字符集与字符编码

    事出有因 在向HttpURLConnection的输出流写入内容时,因没有设置charset,导致接收方对数据的验签不一致. URL url = new URL(requestUrl); //打开连接 ...

  5. JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)

    1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...

  6. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  7. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  8. 关于 WP 开发中.xaml 与.xaml.cs 的关系

    今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...

  9. python语言中的编码问题(续)

    上文提到了python开发中非常重要的两处设置. 一个是编解码器的默认设置defaultencoding >>> import sys >>> sys.getdef ...

随机推荐

  1. spark、storm与Hadoop

    1. Storm是什么,怎么做,如何做的更好?Storm是一个开源的分布式实时计算系统,它可以简单.可靠地处理大量的数据流.Storm有很多应用场景,如实时分析.在线机器学习.持续计算.分布式RPC. ...

  2. JS(二)

    上周给大家介绍了一下JS基础中一点东西,今天给大家介绍一下JS基础中一个重要部分,循环和函数. 04-JS中的循环结构 一.[循环结构的步骤] 1.首先要先声明循环变量. 2.判断循环条件 3.执行循 ...

  3. AngularJS -- HTML 编译器

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ HTML Compiler Overview(HTML 编译器 概要) AngularJ ...

  4. 第4章 同步控制 Synchronization ----critical section 互斥区 ,临界区

    本章讨论 Win32 同步机制,并特别把重点放在多任务环境的效率上.撰写多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作.除非你让它们同心协力,否则必然会出现如第2章所说的&quo ...

  5. vue学习第一篇 hello world

    计划近期开始学习vue.js.先敲一个hello wolrd作为开始. <!DOCTYPE html> <html lang="en"> <head& ...

  6. pongo英雄会-幸运数题解

    显然我们只要知道1~x范围有多少幸运数(用f(x)表示),lucky(x,y)=f(y)-f(x-1). 解法1. 计算排列数 由于y<=1000000000这个规模,我们不能暴力验证每个数是否 ...

  7. MyBatis Generator代码自动生成工具的使用

    MyBatis Generator MyBatis Generator有三种使用方式,分别是maven插件形式.命令行形式以及eclipse插件形式.我在这里使用的是命令行的形式(主要是命令行形式比较 ...

  8. jquery.form.js的重置表单增加hidden重置代码

    jquery.form.js的resetForm()方法无法重置hidden元素,打开文件在1460行加上以下代码即可

  9. HDU 1219 AC Me

    strlen能不用就不用 #include<cstdio> #include<cstdlib> #include<iostream> #include<alg ...

  10. IDL 存储数组

    IDL中的数组在内存中是按行存储的,这是因为IDL最初设计的设计目的是用来处理行扫描卫星数据. 1.一维数组 m个元素的一维数组arr[m]的存储方式为 arr[0]→arr[1]→...→arr[m ...