C#问题中的UTF8(Quoted Printable)转换

时间:2010-07-20 12:38:45

标签: c# utf-8

我从邮箱中提取法语电子邮件,电子邮件中包含重音符号。我相信它使用的是UTF8编码。

我尝试过在互联网上找到的不同的UTF8转换方法,但都没有成功。

例如,在C#中,如何转换它:Montr = C3 = A9al到Montréal?

编辑:此外,它不一致。有时它可能像Montr& eacute;人(仅在添加&符之后的空格,因此浏览器不会转换它。)

谢谢! 标记

2 个答案:

答案 0 :(得分:3)

那不是UTF-8。那是quoted printable,它与UTF-8的编码方式不同 - 它更像是“Unicode文本到Unicode文本”编码。

带引号的printable将有效地允许您将ASCII消息转换为字节数组,然后然后将被解码为UTF-8。

我不确定在引用可打印编码的.NET中是否有任何直接支持,这有点奇怪......我可能错过了一些东西。

答案 1 :(得分:2)

UTF-8编码将字节数组(8位数字)转换为字符串(反之亦然)。即“数字”和“字符”之间存在映射。字符集大于ASCII字符集,例如é是UTF-8的一部分,但不是ASCII的一部分。

Quoted-Prinable编码将一个字节数组(8位数字)转换为ASCII字符序列(实际上是它的一个子集)。

因此,结合两者,您可以将UTF-8字符串“编码”为ASCII字符(子集)的一个子集(ASCII字符串)。

其他编码也可以这样做(例如ISO-8859-1)。因此,您需要同时拥有这两个信息:

  • 给定的ASCII字符串是引用的可打印
  • 结果字节数组表示具有编码UTF-8 的字符串

解码quoted-printable因此有两个步骤:

  1. 通过引用的可打印规则创建字节数组say bytes [],即

    • substring = NM映射到字节NM(其中NM是十六进制)(“N * 16 + M”)
    • 任何其他字符映射到其ASCII字节 (请注意,类似的q-encoded-word具有_到空格的附加映射)
  2. 然后将字节数组解释为UTF-8字符串。