.NET/C#中 System.Text.Encoding 类的一个简单用法
2010-06-22 15:35
465 查看
Encoding 是System.Text 命名空间下面的一个类,顾名思义,它是字符编码相关的一个类。因为在.NET平台上我们最多用的字符串,以及字符型都是UNICODE编码方式的,因此处理对象也多以UNICODE字符串为主。
这个类有大概40个方法,具体可查MSDN,其中有5 个是静态方法可以由 Encoding 类来直接调用,但其实这5个是最不常用的方法:
平常更容易看见的却是:
那这个Default 又是什么东西呢,原来它是 Encoding 类的一个静态 Property 它的类型仍然是Encoding 类,那这儿莫非是用了个Singlinton模式么? i dont know...
所以,上面那些除5个静态方法以外的方法,就要通过这种方式 System.Text.Encoding.Default.XXXX 来调用。
另外同样,既然能 string 转 byte[] ,那当然也能byte[] 转 string 了:
接着看下面的情况:
string s = "test!";
byte[] byteArray = Encoding.Default.GetBytes(s);
Console.WriteLine(byteArray.Length);
foreach (byte b in byteArray)
{
Console.WriteLine(b);
}
如上这段代码,得到BYTE[]的长度是 5 ,我本来想当然地以为会是10呢,因为UNICODE的一个字符编码要占两个字节,但事实上Length这个属性输出的东西是数组的元素个数,并非它的实际字节长度。
可问题是既然一个UNICODE字符要2个字节才能存储,那它的二进制值也必然要大于byte所能容纳的一个字节呀,一一对应的话,如果那个字符的UNICODE值太大,溢出了byte的容纳范围,(众所周知,byte 的聚会范围仅是0-255)会怎么样呢???????为什么要将string 类型转换成 byte[] 呢??????
我将上面的string 换了一下:
string s = "我test!";
这次,输出长度为7!也就是说最前面的这个汉字用了两个byte来存储,而后面的仍然是一个字符一个byte。也就是说,一个字符串,被转换成byte[]时,内部进行了优化的,避免了不必要的内存分配。这点一定要有明确的意识!!!!!!
还要进一步注意的是,如果按下面这种方式显式要求得到一个UNICODE编码的byte[]的话,得到的就是真正的两byte一字符的结果了:
Encoding uni = Encoding.Unicode;
byte[] ba = uni.GetBytes(s);
Console.WriteLine(ba.Length); // 这次的结果是 12
foreach (byte b in ba)
{
Console.WriteLine(b);
}
对比一下两次的输出结果:
206
210
116
101
115
116
33
17
98
116
0
101
0
115
0
116
0
33
0
还是差异很大呀,不注意估计要出问题。
这个类有大概40个方法,具体可查MSDN,其中有5 个是静态方法可以由 Encoding 类来直接调用,但其实这5个是最不常用的方法:
平常更容易看见的却是:
byte[] byteArray = System.Text.Encoding.Default.GetBytes( str );
那这个Default 又是什么东西呢,原来它是 Encoding 类的一个静态 Property 它的类型仍然是Encoding 类,那这儿莫非是用了个Singlinton模式么? i dont know...
public static Encoding Default { get; }
所以,上面那些除5个静态方法以外的方法,就要通过这种方式 System.Text.Encoding.Default.XXXX 来调用。
另外同样,既然能 string 转 byte[] ,那当然也能byte[] 转 string 了:
string str = System.Text.Encoding.Default.GetString( byteArray );
接着看下面的情况:
string s = "test!";
byte[] byteArray = Encoding.Default.GetBytes(s);
Console.WriteLine(byteArray.Length);
foreach (byte b in byteArray)
{
Console.WriteLine(b);
}
如上这段代码,得到BYTE[]的长度是 5 ,我本来想当然地以为会是10呢,因为UNICODE的一个字符编码要占两个字节,但事实上Length这个属性输出的东西是数组的元素个数,并非它的实际字节长度。
可问题是既然一个UNICODE字符要2个字节才能存储,那它的二进制值也必然要大于byte所能容纳的一个字节呀,一一对应的话,如果那个字符的UNICODE值太大,溢出了byte的容纳范围,(众所周知,byte 的聚会范围仅是0-255)会怎么样呢???????为什么要将string 类型转换成 byte[] 呢??????
我将上面的string 换了一下:
string s = "我test!";
这次,输出长度为7!也就是说最前面的这个汉字用了两个byte来存储,而后面的仍然是一个字符一个byte。也就是说,一个字符串,被转换成byte[]时,内部进行了优化的,避免了不必要的内存分配。这点一定要有明确的意识!!!!!!
还要进一步注意的是,如果按下面这种方式显式要求得到一个UNICODE编码的byte[]的话,得到的就是真正的两byte一字符的结果了:
Encoding uni = Encoding.Unicode;
byte[] ba = uni.GetBytes(s);
Console.WriteLine(ba.Length); // 这次的结果是 12
foreach (byte b in ba)
{
Console.WriteLine(b);
}
对比一下两次的输出结果:
206
210
116
101
115
116
33
17
98
116
0
101
0
115
0
116
0
33
0
还是差异很大呀,不注意估计要出问题。
相关文章推荐
- 收了100元辛苦费,写了一个最简单的C#ASP.NET的3层架构例子代码,源码是通过代码生成器生成的【写程序的效率神奇的高】
- 使用C# Builder建一个简单的ASP.NET应用程序
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 开始一个简单的ASP.NET Web API 2 (C#)
- 关于记事本的“查找下一个”以及“向上向下”,C#.net的一个简单实现
- 一个简单的C#多线程间同步的例子 from 小菜鸟之家~ASP.NET 入门中
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- [ASP.net(C#)]最简单的一个存储过程
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- 一个简单的动态编译器,支持C#和VB.NET。当你想测试一些简单的代码的时候可以使用。
- 一个简单的UDP程序—C++服务器和C# .NET客户端
- 一个简单的用ASP.NET/C#开发的组件化Web应用程序(附源代码)
- Asp.net 在网页编写C#代码示例-- 一个简单的web MsSql 命令执行环境
- .net c# 一个简单但是功能强大动态模板引擎
- 一个简单的ADO.NET C# 数据库操作实例
- asp.net(C#)一个简单的数据访问类
- 一个简单的AJAX实现,基于C#的ASP.Net,包括服务器端的程序代码
- 章鱼哥出品_VB.NET 线程委托应用实例 一个简单的例子让你轻松掌握委托的用法
- 一个简单的AJAX实现,基于C#的ASP.Net,包括服务器端的程序代码