亳州是网站建设,app制作公司哪家好,wordpress+免费模版,企业网站管理系统如何使用说明我的上篇文章#xff0c;有朋友提出字符集和编码的区别#xff0c;我在此立文和大家讨论下 常说的字符集和编码区别#xff0c;其实就是编码字符集和字符集编码的区别#xff0c;其实#xff0c;单单如果只是说字符集#xff0c;没有任何编码的概念的话#xff0c;那么字…我的上篇文章有朋友提出字符集和编码的区别我在此立文和大家讨论下 常说的字符集和编码区别其实就是编码字符集和字符集编码的区别其实单单如果只是说字符集没有任何编码的概念的话那么字符集其实仅仅是一个简单的字符的集合或者说是一个抽象的字符的集合包括文字符号等等不参与任何存储形式只是存在这么各种各样标准的字符的集合 如果仅仅是抽象的字符集我们是无需拿出讨论的因为没有任何异议通俗易懂而常说的字符集指的编码字符集比如常见的 unicode、ascii、gb2312、gbk等这些我们常称做为字符集其实是编码字符集这些字符集比如unicode其实本质上是已经“编码”过的字符集即每个字符都有唯一的整数编号每个字符都有自己特有的编号同一个字符在不同编码字符集中编号也会不同当然很多编码字符集都是ascll的超集所以ascll字符集的编号与很多编码字符集中编号都一样比如英文字母“A”在ASCII及Unicode及GB2312中均是第0x41个字符说到这里朋友一定注意到了我上面再描述“ unicode其实本质上是已经“编码”过的字符集”中的“编码”二字加了双引号我要强调的是这里的“编码”并不是真的我下面要说的编码这里只是为每个字符编了一个对应的编号但是我们还是习惯专业的称呼为“编码字符集” 我们经常说“文章采用的是utf-8编码方式” 我对于这个编码方式的意义个人理解是 将一个字符的整数编号用一个什么二进制的整数值来对应并在计算机存储。这和上面说的编码字符集中的“编码”千差万别这里我们称之为“字符集编码”即我们常说的编码 说到这里很多人会觉得那么unicode和utf-8的区别在哪里既然上文说到unicode是编码字符集那么utf-8又是什么就是常说的编码 “文章采用的是utf-8编码方式”个人觉得准确的说法是“文章采用的是基于unicode编码字符集的utf-8的编码方案”即 即unicode本身作为编码字符集没有任何存储形式只是一个编号和字符对应的表而已如何在计算机存储你可能想到了干脆直接把编号当作二进制数值来直接存储那么为什么不这么做呢这也算是一种字符集编码方案就是基于unicode编码字符集的utf-32编码方案那么有没有更加智能一点的编码方案呢为什么会没有呢那就是utf-8、utf-16等等 等等在我解释为何要用utf-8编码方案的时候我必须说明一件事情如下 我在上一篇文章《你不知道的 页面编码浏览器选择编码getpost各种乱码由来》中说过“如何查看中文字符的十六进制字符串方法BitConverter.ToString(System.Text.Encoding.UTF8.GetBytes(阿道夫));” 请注意我可以改为“System.Text.Encoding.Unicode.GetBytes” 如下图是vs2013 Encoding键入“.”后的智能提示 列表过长用两幅图分别截图 上图有两个疑问 1、如果说unicode是编码字符集为何会出现在和utf-8这种编码方案并列的列表中 2、ASCII或者gb2312都是编码字符集为何也会出现在和utf-8这种编码方案并列的列表中 我们假设有两个猜测 1、此处的unicode并不是真正的unicode编码字符集可能只是一种和unicode编码字符集关系非常紧密的一种编码方案 2、ASCII或者gb2312其实就是图中的Default,即操作系统当前的编码国内一般为gb2312是编码字符集没有错但是对于ASCII或者gb2312都只有唯一一种编码那么我称呼它们为ASCII编码或者GB2312编码也没有问题既然这样那我把ascii和gb2312加入和utf-8这种编码方案并列的列表中也理所当然 我的两个假设很快得到论证 1、在Encoding 的元数据看到 1 //
2 // 摘要:
3 // 获取使用 Little-Endian 字节顺序的 UTF-16 格式的编码。
4 //
5 // 返回结果:
6 // 使用 Little-Endian 字节顺序的 UTF-16 格式的编码。
7 public static Encoding Unicode { get; } 这里解释在这里的unicode其实本质上“获取使用 Little-Endian 字节顺序的 UTF-16 格式的编码”即使基于unicode编码字符集的utf-16编码方案类似的有BigEndianUnicode获取使用 Big Endian 字节顺序的 UTF-16 格式的编码2、一般的ASCII或者gb2312我们可以称呼为ASCII字符集也可以称呼为ASCII编码只是意义不同而已因为对于ASCII编码字符集或者gb2312编码字符集都只有唯一一种编码就是ASCII编码和GB2312编码那么列表中显示的ASCII和GB2312指的不是编码字符集而是ASCII和GB2312的编码方案我想正是这种原因才在很多时候不管是字符集赋值还是编码方案赋值都可以直接用gb2312或者ascii比如Encoding gb2312 Encoding.GetEncoding(gb2312);Response.ContentEncoding gb2312;//编码Response.Charsetgb2312;//字符集 总结下的说就是unicode是字符集不是编码但是asciigb2312是字符集这个说法肯定正确但是我表达为“ascii编码”也不能说大错特错但是这种说法让人误解如果一定要说那么就说“ascii编码字符集的编码” 如果理解上面两个假设的论证道理那么我们继续讨论之前暂停的话题即“解释为何要用utf-8等编码方案其他utf编码方案类似”utf-8将很大一部分基于unicode编码字符集的字符的整数编号作了变换后存储在计算机中。引用以“汉”字为例“汉”的Unicode值为0x6C49但其编码为UTF-8格式后的值为0xE6B189注意到变成了三个字节。对于UTF-16编码方案则是对unicode编码字符集中的前65536个字符编号都不做变换直接作为计算机存储时使用的值对65536以后的字符仍然要做变换例如“汉”字的Unicode编号为0x6C49那么经过UTF-16编码后存储在计算机上时它的表示仍为0x6C49对于UTF-32编码方案他对所有的Unicode字符均不做变换直接使用编号存储只是这种编码方案太浪费存储空间就连1个字节就可以搞定的英文字符它都必须使用4个字节 既然unicode编码字符集有如此多的编码方案那么utf-8字母数字符号等占1字节汉字占三字节utf-16,对unicode编码字符集中的前65536个字符都占两个字节utf-32全部占四字节如果还有人问“unicode编码每个字符占几个字节”我们可以理直气壮的说第一unicode不是编码第二每个字符具体占多少字节是要看编码方案 很多面试题会问 1 string param abc阿道夫;
2 int length1 System.Text.Encoding.Unicode.GetBytes(param).Length;//别忘了这里的unicode本质是utf-16编码方案
3 int length2 param.Length; 那么答案就是12和6了最后对于gb2312或者ascii编码字符集的字符的编号就是直接存储在计算机中的二进制数也就是说gb2312和ascii编码字符集都只有一种编码方案因为在gb2312编码字符集中的ascii字符集部分的编号并没有变化即和ascii编码字符集中的编码一致所以gb2312的ascii部分字符存入计算机的二进制数还是占用1个字节而中文字符存入计算机的二进制数也是该中文字符在gb2312编码字符集中的编号该编号一般转换成二进制数都占两个字节这个过程也就变成了所谓的gb2312编码如果上面的改为System.Text.Encoding.Default.GetBytes(param).Length则值就是9和6了 如果需要了解更加深入的编码内部原理请参考http://blog.csdn.net/nodeathphoenix/article/details/7057760 转载于:https://www.cnblogs.com/yinhaichao/p/4090802.html