理解文本编码(在.Net中)

我对Text的编码做的很少。 说实话,我甚至都不知道它究竟意味着什么。

例如,如果我有类似的东西:

Dim myStr as String = "Hello" 

这是以特定格式在内存中“编码”的吗? 这种格式取决于我使用的语言吗?

如果我在另一个国家,比如中国,我有一串中文(普通话?如果我在这里使用了错误的词语,我道歉)下面的代码(我在英文字符串上使用得很好)还是一样吗?

 System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); return encoding.GetBytes(str); 

或者当转换无效时将.Net字符串转换为UTF8Encoding时会失去所有意义吗?

最后,我已经与.Net合作了几年,而且我从未见过,听说过或者不得不对编码做任何事情。 我是例外,还是不常见的事情?

.NET字符串类使用UTF16编码字符串 – 这意味着每个字符2个字节(尽管它允许两个字符的特殊组合形成一个4字节字符,因此称为“代理对”)。

另一方面, UTF8将使用表示特定Unicode字符所需的可变字节数,即对于常规ASCII字符只有一个字节,但对于中文字符可能只有3个字节。 两种编码都允许表示所有Unicode字符,因此它们之间总是存在映射 – 两者都是相同(unicode)字符集的不同二进制表示(即用于存储在内存中或磁盘上)。

由于并非所有Unicode字符都能够容纳UTF-16保留的原始2字节,因此该格式还允许表示两个UTF-16字符的组合以形成4字节字符 – 这样形成的字符称为“代理”或代理对,是一对16位Unicode编码值,它们一起代表一个字符。

UTF-8没有这个问题,因为每个Unicode字符的字节数不固定。 可以在此处收集有关UTF-8,UTF-16和BOM的良好总体概述。

Unicode字符编码的优秀概述/介绍是绝对最低每个软件开发人员绝对必须知道关于Unicode和字符集

首先和前瞻:不要绝望,你并不孤单。 一般来说,意识到字符编码和文本表示的处理是不常见的事情,但现在没有比现在更好的时间开始学习了!

在现代系统(包括.NET)中,文本字符串通过Unicode 代码点的某些编码在内存中表示。 这些只是数字。 字符A的代码点是65 。 版权(c)的代码点是169 。 泰语六位的代码点是3670

术语“编码”指的是这些数字如何在存储器中表示。 使用了许多标准编码,因此当数据从一个系统传输到另一个系统时,文本表示可以保持一致。

一个简单的编码标准是UCS-2,其中代码点作为16位字存储在raw中。 这是有限的,因为它只能代表代码点0000-FFFF并且这样的范围不能涵盖Unicode代码点的全部范围。

UTF-16是.NET String类内部使用的编码。 这里大多数字符都适合单个16位字,但是大于FFFF值是使用代理对编码的(参见Wiki)。 由于这种编码方案,UTF-16无法插入代码点D800-DFFF

UTF-8可能是目前使用最流行的编码,原因有很多,这些原因在Wiki文章中有所概述。

UTF是具有多种不同大小的特定类型的编码。 每种编码类型都是字符将占用多少内存以及该内存中的表示forms。

通常我们使用Unicode和Ascii。

Unicode是每个字符2个字节。
Ascii是每个字符1个字节。

Ascii可以用unicode表示。 但是,如果没有编码,则无法在ascii中表示Unicode。

UTF编码使用特殊字符’%’来告诉您以下是编码字符的hex值。

例如,%20是字符32,实际上是空格。

 http://www.google.com?q=space%20character 

将该URL放在浏览器中将UTF-8解码该字符串,而q =实际上将被解释为“空格字符”,注意%20现在是一个空格。

UTF-16使用2个字节并且表示为这样。

 http://www.google.com?q=space%0020character 

这个例子实际上会失败,因为URI实际上应该使用UTF-8,但是这个例子certificate了这一点。

Unicode字符为0020或两个字节,值分别为0和32。

普通话是某种类型的unicode字符,UTF-16会对Unicode进行编码,因此它可以在Ascii中表示。

这是一篇维基文章,深入解释了一些内容

http://en.wikipedia.org/wiki/UTF-8