陋室铭
永远也不要停下学习的脚步(大道至简至易)

posts - 2169,comments - 570,views - 413万

首先 我们写两个代码

 

1.byte[] q=  System.Text.Encoding.UTF8.GetBytes("哈");

2.
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, "哈");
stream.Close();
byte[] qq=stream.ToArray();

第一个方法是把"哈"字符串转换成UTF8码,第二个是序列化"哈"

不同之处在于

一.

1是单纯的转码

2是序列化"哈"这个字符串对象,一个对象包括很对内容(属性,方法,索引器等等)

序列化对象就是把对象变成byte[]的格式,因为对象的成员很复杂,而且类型不同,所以变起来没有转码那么简单

二.

我们会发现,2并没有指定编码格式,难道序列化就不需要指定编码格式吗,那当然是不可能的,通过我实验当序列化对象时,把对象中数据成员的字符串转化为byte[]是按照UTF8码来做的,其它类型我没有实验

 

那为什么要用UTF8而不用Unicode?

看一下 下面的解释

 UTF8效率
  1.每个英文字母、数字所占的空间为1 Byte;
  2.泛欧语系、斯拉夫语字母占2 Bytes;
  3.汉字占3 Bytes。
用Unicode的话,英文也变成2 Bytes了
原来老美是为了照顾自己 而损失了汉语的效率,明白了了吧

由此可见UTF8对英文来说是个非常诱人的方案,但对中文来说则不太合算,无论用ANSI还是 Unicode/UCS2来编码都只用2 Bytes,但用UTF8则需要3 Bytes。
  以下是一些统计资料,显示用UTF8来储存文件每个字符所需的平均字节:
  1.拉丁语系平均用1.1 Bytes;
  2.希腊文、俄文、阿拉伯文和希伯莱文平均用1.7 Bytes;
  3.其他大部份文字如中文、日文、韩文、Hindi(北印度语)用约3 Bytes;
  4.用超过4 Bytes的都是些非常少用的文字符号。

 

一开始我用序列化的时候,我就很奇怪,为什么不用指定编码,原来不是没指定,而是序列化对象自身已经做好了算法,(有可能针对不同类型用了很多不同的编码,自定义很复杂,失去了意义,系统指定的最优化编码)并没有提供给外接指定编码的接口(可以自定义序列化,但不知道可不可以自定义序列化编码)

一家之言,不敢肯定是正确的,作为参考吧

posted on   宏宇  阅读(1488)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2007-07-02 今天做销售功能时在财务统计上遇到一个问题 想了一个解决方案
< 2009年7月 >
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示