2011-05-03 58 views
18

我对文本的编码做了很少的工作。说实话,我真的不知道它究竟意味着什么。了解文本编码(在.Net中)

举例来说,如果我有这样的:

Dim myStr as String = "Hello" 

是在一个特定的格式,“编码”的记忆是什么?这种格式取决于我使用的语言吗?如果我在另一个国家,例如中国,并且我有一串中文(普通话?我的道歉,如果我在这里使用了错误的单词)会使用以下代码(我已经使用了罚款对英文字符串)仍然工作相同?

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

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

最后,我已经使用.Net几年了,我从来没有见过,听说过,或者不得不做任何与编码。我是个例外,还是不是常见的事情?

+3

很好的问题......很多开发者都以此为荣,以我的经验。 – jeroenh 2011-05-03 07:35:09

回答

25

.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的良好总体概述here

极好概述/介绍Unicode字符编码是The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

+0

谢谢你的链接(和你的答案的其余部分) – 2011-05-03 02:03:42

+0

真棒文章! (“绝对最低...”) 我以为我有一个很好的理解,并仍然学到了一些东西。 阅读它! – 2014-04-11 12:43:22

1

UTF是特定类型的具有多个不同尺寸的编码。每种编码类型都是多少内存以及该内存中字符所需的表示。

通常我们使用Unicode和Ascii。

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

Ascii可以用unicode表示。然而Unicode不能用ascii表示,不用编码。

UTF编码使用特殊字符'%'告诉您,以下是编码字符的十六进制值。

%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,但这个例子证明了这一点。

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

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

这里是一个wiki文章深入

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

9

第一,foremeost解释多一点:不要绝望,你并不孤单。一般来说,对字符编码和文本表示的处理的认识是不常见的,但现在没有比现在更好的开始学习的时间了!

在包括.NET在内的现代系统中,文本字符串在内存中由Unicode code points的某种编码表示。这些只是数字。字符A的代码点是65。版权(c)的代码点是169。泰国数字6的代码点是3670

术语“编码”是指这些数字如何在内存中表示。有一些标准编码被使用,以便在数据从一个系统传输到另一个系统时,文本表示可以保持一致。

一个简单的编码标准是UCS-2,其中代码点以原始形式存储为16位字。这是有限的,因为它只能代表代码点0000-FFFF,这样的范围并不包括Unicode代码点的全部宽度。

UTF-16是.NET String类内部使用的编码。大多数字符都适用于单个16位字,但大于FFFF的值使用代理对进行编码(请参阅Wiki)。由于这种编码方案,代码点D800-DFFF不能被UTF-16编码。

UTF-8也许是今天使用的最流行的编码,有许多理由在Wiki文章中有概述。