上篇虽然主要讲述简单工厂模式,但其中包含的内容也挺多,涉及到工厂模式和单件模式,所以篇幅比较长.
这篇就来谈谈.Net Framework中简单工厂模式的运用,一切将会变的非常有趣.
一)System.Text.Encoding
第一部份:编码相关知识介绍,如果你只对简单工厂模式的应用感兴趣,那直接跳到第二部份吧.
Encoding为我们提供了各种编码,我们平常可能编码接触的并不是很多,所以我们先来了解一下,说不定下次就用到了.
1.人们怎么跟计算机交流呢?使用二进制,0110001001010110000011101011010......眼花缭乱了没,哈哈.
2.老美在痛苦不堪后,决定使用比较亲切的abcdefg 24个字母与计算机交流. 那字母到0,1是如何转换呢?
ASCII编码来了: 字符a 对应的十进制为97, 对应的十六进制为61, 对应的二进制为 0011 1101 刚好为一个字节
实验一:使用ASCII编码a,b输出十进制
byte[] b = System.Text.Encoding.ASCII.GetBytes("ab");
for (int i = 0; i < b.Length; i++)
Response.Write(b[i].ToString() + " ");输出: 97 98
说明: ToString()输出为十进制, 字符a对应97 字符b对应98
实验二:使用ASCII编码a,b输出十六进制
byte[] b = System.Text.Encoding.ASCII.GetBytes("ab");
for (int i = 0; i < b.Length; i++)
Response.Write(b[i].ToString("x") + " ");输出:61 62
说明: ToString("x")输出为十六进制, 字符a 对应61 字符b对应62
实验三:使用ASCII编码a,b使用BitConverter输出十六进制
byte[] b = System.Text.Encoding.ASCII.GetBytes("ab");
Response.Write(BitConverter.ToString(b));输出:61-62
说明: BitConverter.ToString(byte[]) 输出为十六进制
有兴趣可以查看BitConverter.ToString(byte[])的源码,比较简单,注意一下该方法会在两个字节中间添加一个分隔符
3.中国人不爽了,我要用中文与计算机交流,我可不想使用英文与计算机交流.
GB2312编码来了
实验四:使用Gb2312编码 "小菜" ,输出十进制
byte[] b = System.Text.Encoding.GetEncoding("gb2312").GetBytes("小菜");
for (int i = 0; i < b.Length; i++)
Response.Write(b[i].ToString() + " ");输出:208 161 178 203
说明: 输出十进制, '小' 对应208 161 占两个字节 '菜' 对应 178 203 占两个字节
实验五:验证十进制208 161 178 203 可以转换成 "小菜"
byte[] b = new byte[] { 208, 161, 178, 203 };
string name = System.Text.Encoding.GetEncoding("gb2312").GetString(b);
Response.Write(name);
输出:小菜
说明: 看来十进制转换成字符串没问题
注意:前后的编码必须一致都为gb2312才行.
实验六:使用Gb2312编码 "小菜" ,输出十六进制
byte[] b = System.Text.Encoding.GetEncoding("gb2312").GetBytes("小菜");
for (int i = 0; i < b.Length; i++)
Response.Write(b[i].ToString("x") + " ");
输出:d0 a1 b2 cb
说明: 输出为十六进制,'小' 对应d0 a1 '菜' 对应 b2 cb
实验七:验证十六进制d0 a1 b2 cb 可以转换成 "小菜"
byte[] b = new byte[] { 0xd0, 0xa1, 0xb2, 0xcb };
string name = System.Text.Encoding.GetEncoding("gb2312").GetString(b);
Response.Write(name);
输出:小菜
说明: 看来十六进制转换成字符串没问题
4.日本人,韩国人,希腊人......也不爽了,他们也想使用自己的语言来使用计算机.
于是日语,韩语,希腊语......也需要转换成二进制.
日语使用XXX进行编码,韩语使用XXX进行编码,希腊语使用XXX进行编码......
看来这不是个办法,我们需要统一的编码才行.
UTF-8编码,Unicode编码来了,他们两兄弟志在统一全球的编码.就也是为什么现在JavaScript,Java等许多语言的char都是
使用Unicode编码,都是两个字节,而不在是一个字节,就是以全球化为目的.
统一的编码有什么好处呢?看看Google
使用Google搜索,有时你会看到搜索的内容中出现日语,咦,怎么不是乱码呢?
因为Google使用UTF-8编码:<meta http-equiv=content-type content="text/html; charset=UTF-8">
那百度呢?百度使用gb2312编码:<meta http-equiv="content-type" content="text/html;charset=gb2312">
所以如果有朝一日你在百度的搜索内容