【问题标题】:System.Text.Encoding.UTF8.GetBytes Extra ByteSystem.Text.Encoding.UTF8.GetBytes 额外字节
【发布时间】:2013-09-26 19:22:25
【问题描述】:

为什么会有这一行

System.Text.Encoding.UTF8.GetBytes("ABCD±ABCD")

给我 10 个字节而不是 9 个字节? 虽然 ± 是 char(177)

是否有 .Net 函数/编码可以将此字符串正确翻译成 9 个字节?

【问题讨论】:

  • “正确”很大程度上取决于“正确”编码是什么。如果您打算使用 UTF-8,那么:没有办法将其“正确”编码为 9 个字节。如果您的意图是使用 some 编码将其变为 9 个字节,则需要预先确定要使用的基于代码页的编码以及原因,以及您将对该代码页中未定义的数据执行什么操作。
  • “正确”的定义:能够将其从字节转换回原始字符。示例:ASCII 编码将无法正确执行此操作,尽管它将被限制为我预期的 9 个字符。

标签: c# .net vb.net utf-8 character-encoding


【解决方案1】:

虽然 ± 是 char(177)

而 UTF-8 编码是 0xc2 0xb1 - 两个字节。基本上,每个代码点 >= 128 将占用多个字节 - 其中字节数取决于代码点的大小。

当使用 UTF-8 编码时,该数据为 10 个字节。这里的错误是你期望它需要 9。

【讨论】:

  • “正确”的定义:能够将其从字节转换回原始字符。示例:ASCII 编码将无法正确执行此操作,尽管它将被限制为我预期的 9 个字符。
  • 我想我希望 UTF8 每个字符只使用 8 位(顾名思义——至少对我而言),仅此而已。
【解决方案2】:

您应该使用Windows-1251 编码来获得±177

var bytes = System.Text.Encoding.GetEncoding("Windows-1251").GetBytes("ABCD±ABCD");

【讨论】:

  • +1,但你应该解释为什么它可能会像他期望的那样在 Windows-1251 而不是 UTF-8 上工作。
  • 然后当有人试图在 0xFF 之外对某些内容进行编码时观看烟花......
  • 这是我一直在寻找的答案。而且我完全理解 0xFF 之外的任何内容都不能编码为单个字节。如果您已经解释了 UTF8 的工作原理,那将是一个完美的答案。下面@user2316005 发布的视频链接很好地解释了这一点。
【解决方案3】:

± 不在 ASCII 范围内,所以它用 2 个字节表示。

【讨论】:

    【解决方案4】:

    这个视频很好地解释了 utf-8 编码:http://www.youtube.com/watch?v=MijmeoH9LT4。看完之后你会明白为什么它会导致更多的字节和你想的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2010-11-13
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多