【问题标题】:Understanding Text Encoding (In .Net)了解文本编码(在 .Net 中)
【发布时间】:2011-08-17 09:09:55
【问题描述】:

我在文本编码方面做得很少。说实话,我什至不知道它到底是什么意思。

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

Dim myStr as String = "Hello"

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

如果我在另一个国家,例如中国,并且我有一串中文(普通话?如果我在这里使用了错误的词,我深表歉意)是否会使用以下代码(我在英文字符串)仍然可以正常工作吗?

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

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

最后,我已经使用 .Net 工作了几年,但我从未见过、听过或不得不对 Encoding 做任何事情。我是例外,还是不常见?

【问题讨论】:

  • 好问题...根据我的经验,许多开发人员都在为此苦苦挣扎。

标签: c# .net vb.net text encoding


【解决方案1】:

.NET 字符串类使用 UTF16 对字符串进行编码 - 这意味着每个字符 2 个字节(尽管它允许两个字符的特殊组合形成一个 4 字节字符,即所谓的“代理对”)。

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

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

UTF-8 没有这个问题,因为每个 Unicode 字符的字节数是不固定的。 here 可以收集有关 UTF-8、UTF-16 和 BOM 的全面概述。

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

【讨论】:

  • 感谢您提供该链接(以及您的其余答案)
  • 很棒的文章!! (“绝对最小值……”)我以为我理解得很好,但仍然学到了一些东西。阅读它!!!
【解决方案2】:

UTF 是一种具有多种不同大小的特定编码类型。每种编码类型是多少内存以及字符将在该内存中采用什么表示形式。

通常我们使用 Unicode 和 Ascii。

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

Ascii 可以用 unicode 表示。但是 Unicode 不能在未经编码的情况下用 ascii 表示。

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

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

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

将该网址放在浏览器中会 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

【讨论】:

    【解决方案3】:

    首先也是最重要的:不要绝望,你并不孤单。不幸的是,一般而言,了解字符编码和文本表示的处理方法并不常见,但现在就是开始学习的最佳时机!

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

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

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

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

    UTF-8 可能是当今最流行的编码,其原因有很多,在 Wiki 文章中进行了概述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2017-12-25
      • 2021-12-13
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多