在 Windows Vista 及之后的版本中,每个Unicode字符都使用UTF-16编码,UTF的全称是 Unicode Transformation Format(Unicode 转换格式)。UTF-16将每个字符编码为2个字节(或者说16位)。Windows 之所以使用 UTF-16,是因为全球各地使用的大部分语言中,每个字符很容易用一个16位值来表示。这样一来应用程序很容易遍历字符串并计算出它的长度。但是,16位不足以表示某些语言的所有字符。对于这些语言,UTF-16 支持使用代理(suurrigate),后者是用32位(或者说4个字符)来表示一个字符的一种方式。由于只有少数应用程序需要表示这些语言中的字符,所以 UTF-16 在节省空间和简化编码这两个目标之间,提供了一个很好的折衷。注意,.Net Framework 始终使用 UTF-16来编码所有字符和字符串,所以在我们开发的 Windows 应用程序中,如果需要本机代码(native code)和托管代码之间传递字符或字符串,使用 UTF-16能改进性能和减少内存消耗。

  UTF-8 将一些字符编码为1个字节,一些字符编码为2个字节,一些字符编码为3个字节,一些字符编码为4个字节。值在0x0080一下的字符压缩为1个字节,这对美国使用的字符非常合适。0x0080 和0x07FF之间的字符转换为2个字节,这对欧洲和中东地区的语言非常使用。0x0800以上的字符都转换为3个字节,适合东亚地区的语言。最后,代理对(surrogate pair)被写为4个字节。UTF-8 是一种相当流行的编码格式。但在对值为0x0800及以上的大量字符进行编码的时候,不如 UTF-16 高效。

  UTF-32 将每个字符都编译为4个字节。如果打算写一个简单的算法来遍历字符(任何语言中使用的字符),但又不想处理字节数不定的字符,这种编码方式就非常有用。例如,如果采用UTF-32 编码方式,就不需要关系代理(surrogate)的问题,因为每个字符都是4个字节。显然,从内存使用的角度来看,UTF-32 并不是一种高效的编码格式。因此在将字符串保存到文件或传到网络的时候,很少会用到这种格式。这种编码格式一般在应用程序内部使用。

为何要用Unicode

  Unicode 有利于应用程序本地化。

  只用 Unicode ,只需发布一个二进制(.exe或dll)文件,即可支持所有语言。

  Unicode 提升了应用程序的效率,因为代码执行速度更快,占用内存更少。 Windows内部的一切工作都是使用 Unicode 字符和 Unicode 字符串来进行的。所以,加入我们坚持传入 ANSI 字符或者字符串,Windows 就会被迫分配内存,并将 ANSI 字符或字符串转换为等价的 Unicode 形式。

  使用 Unicode,应用程序能轻松调用所有尚未弃用(nondeprecated)的 Windows 函数,因为一些 Windows 函数提供的版本只能处理 Unicode 字符和字符串。

  使用 Unicode,应用程序的代码很容易与 COM 集成(后者要求使用 Unicode 字符和 Unicode 字符串)。

  使用 Unicode,应用程序的代码很容易与 .NET Framework 集成(后者要求使用 Unicode 字符和 Unicode 字符串)。

  使用 Unicode,能保证应用程序的代码能够轻松操纵我们自己的资源(其中的字符串总是 Unicode 形成的)。

C#之字符编码的更多相关文章

  1. Python遇到字符编码出问题的一个相对万能的办法

    在使用Python做爬虫的过程中,经常遇到字符编码出问题的情况. UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' ...

  2. python学习笔记(基础一:'hello world'、变量、字符编码)

    第一个python程序: Hello World程序 windows命令行中输入:python,进入python交互器,也可以称为解释器. print("Hello World!" ...

  3. Python学习Day2笔记(字符编码和函数)

    1.字符编码 #ASCII码里只能存英文和特殊字符 不能存中文 存英文占1个字节 8位#中文编码为GBK 操作系统编码也为GBK#为了统一存储中文和英文和其他语言文字出现了万国码Unicode 所有一 ...

  4. mysql 5.5 修改字符编码

    修改/etc/mysql/my.cnf 配置文件: 最后重启mysql 服务,再查看: 编码已经改好了,可以支持中文字符编码了.

  5. mysql命令行修改字符编码

    1.修改数据库字符编码 mysql> alter database mydb character set utf8 ; 2.创建数据库时,指定数据库的字符编码 mysql> create ...

  6. 关于Unicode,字符集,字符编码,每个程序员都应该知道的事

    关于Unicode,字符集,字符编码,每个程序员都应该知道的事 作者:Jack47 李笑来的文章如何判断一个人是否聪明?中提到: 必要.清晰.且准确的概念,是一切思考的基石.所谓思考,很大程度上,就是 ...

  7. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  8. ASP.NET 字符编码的那些事

    ASP.NET 中的字符编码问题,一般会有两个场景: HTML 编码:一般是动态显示 HTML 字符或标签,写法是:HttpUtility.HtmlDecode(htmlString) 或 Html. ...

  9. 【字符编码】Java字符编码详细解答及问题探讨

    一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...

  10. 【字符编码】字符编码 && Base64编码算法

    一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...

随机推荐

  1. 【栈和队列】2、栈的基本实现 - Java

    简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 栈的实现 Stack<E> void push(E) E pop() E peek() int getSize() b ...

  2. 【Linux】E297: Write error in swap file 解决办法

    今天登陆到服务器上,发现通过vi 打开文件就会报错: E297: Write error in swap file E303: Unable to open swap file for "c ...

  3. 利用iptables防火墙保护web服务器

    实例:利用iptables防火墙保护web服务器 防火墙--->路由器-->交换机-->pc机 配置之前,清空下已有的规则,放在规则冲突不生效 工作中,先放行端口写完规则,再DROP ...

  4. oracle新增ID主键列,如何补全旧数据的ID值

    1.创建SEQUENCE CREATE SEQUENCE MONKEY.TEST_ADD_IDCOL_ID CACHE 100; 2.新增表栏位 ALTER TABLE MONKEY.TEST_ADD ...

  5. 前端开发好帮手,eslint配置全知道

    eslint让人又爱又恨,原因在于它的默认配置非常严格,动则一个小提示就直接报错不给运行.而在开发调试的过程中,我们想时时得到运行效果,它的严格又很烦. 在安装eslint后,我们可以在package ...

  6. Mybatis解决字段与属性不匹配的问题、链表查询、嵌套查询、#{}和${}的区别

    1.使用接口结合xml映射文件 创建一个接口,该接口要和映射文件匹配(接口中方法名要和映射文件中的id相同) 映射文件中命名空间要和接口全类名相同 测试: 创建一个与src同级的源文件夹resourc ...

  7. 从JAVA内存到垃圾回收,带你深入理解JVM

    摘要:学过Java的程序员对JVM应该并不陌生,如果你没有听过,没关系今天我带你走进JVM的世界.程序员为什么要学习JVM呢,其实不懂JVM也可以照样写出优质的代码,但是不懂JVM有可能别被面试官虐得 ...

  8. Scrapy———反爬蟲的一些基本應對方法

    1. IP地址驗證 背景:有些網站會使用IP地址驗證進行反爬蟲處理,檢查客戶端的IP地址,若同一個IP地址頻繁訪問,則會判斷該客戶端是爬蟲程序. 解決方案: 1. 讓Scrapy不斷隨機更換代理服務器 ...

  9. HTTP/2与HTTP/3的新特性

    解密HTTP/2与HTTP/3的新特性 - InfoQ https://www.infoq.cn/article/kU4OkqR8vH123a8dLCCJ

  10. (转载)微软数据挖掘算法:Microsoft 神经网络分析算法(10)

    前言 有段时间没有进行我们的微软数据挖掘算法系列了,最近手头有点忙,鉴于上一篇的神经网络分析算法原理篇后,本篇将是一个实操篇,当然前面我们总结了其它的微软一系列算法,为了方便大家阅读,我特地整理了一篇 ...