在 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. 使用 C# 9 的records作为强类型ID - JSON序列化

    在本系列的上一篇文章中,我们注意到强类型ID的实体,序列化为 JSON 的时候报错了,就像这样: { "id": { "value": 1 }, "n ...

  2. 【Linux】make编译的小技巧

    ------------------------------------------------------------------------------------------------- | ...

  3. IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerp

    [root@k8s-master ~]# scp /etc/sysctl.d/k8s.conf root@192.168.30.23:/etc/sysctl.d/k8s.conf@@@@@@@@@@@ ...

  4. IE浏览器直接在页面中显示7z文件而不是下载问题解决

    IE浏览器中输入7z文件的完整下载URL后,不是保存文件,而是直接在页面中显示(当然是乱码) 这是因为浏览器对不同的资源文件处理的方式不同,例如图片文件,一般会直接打开,所以我们可以不用7z,使用zi ...

  5. apijson简单使用

    apijson简单使用 介绍 APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库.为简单的增删改查.复杂的查询.简单的事务操作 提供了完全自动化的 ...

  6. springmvc 字符串转日期格式

    http://www.mamicode.com/info-detail-2485490.html

  7. 生僻标签 fieldset 与 legend 的妙用

    谈到 <fieldset> 与 <legend>,大部分人肯定会比较陌生,在 HTML 标签中,属于比较少用的那一批. 我最早知道这两个标签,是在早年学习 reset.css ...

  8. python_mmdt:一种基于敏感哈希生成特征向量的python库(一)

    概述 python_mmdt是一种基于敏感哈希的特征向量生成工具.核心算法使用C实现,提高程序执行效率.同时使用python进行封装,方便研究人员使用. 本篇幅主要介绍涉及的相关基本内容与使用,相关内 ...

  9. 面试必问:如何实现Redis分布式锁

    摘要:今天我们来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理. 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubb ...

  10. 请谨慎使用 avaliable 方法来申请缓冲区

    问题 今天开始尝试用 Java 写 http 服务器,开局就遇到 Bug. 我先写了一个多线程的.BIO 的 http 服务器,其中接收请求的部分,会将请求的第一行打印出来. 下面是浏览器发出的请求和 ...