【问题标题】:What is "=C2=A0" in MIME encoded, quoted-printable text?MIME 编码的可引用打印文本中的“=C2=A0”是什么?
【发布时间】:2026-01-17 00:20:06
【问题描述】:

这是我尝试解析的示例原始电子邮件:

MIME-version: 1.0
Content-type: text/html; charset=UTF-8
Content-transfer-encoding: quoted-printable
X-Mailer: Verizon Webmail
X-Originating-IP: [x.x.x.x]

=C2=A0test testing testing 123

什么是=C2=A0?我已经尝试了六种带引号的可打印解析器,但没有一个能正确处理这个问题。 如何在 C# 中正确解析这个?

老实说,我现在正在编码:

//TODO WTF
encoded = encoded.Replace("=C2=A0", "");

因为我无法弄清楚为什么该文本会随机出现在 MIME 内容中,并且不应该呈现为任何内容。通过删除它,我得到了想要的效果 - 但是为什么?!

明确地说,我知道 (=[0-9A-F]{2}) 是一个编码字符。但在这种情况下,它似乎代表什么。

【问题讨论】:

    标签: encoding mime quoted-printable


    【解决方案1】:

    =C2=A0 表示字节 C2 A0。由于这是 UTF-8,因此它转换为 U+00A0,即不间断空格的 Unicode。

    参见UTF-8(*)。

    【讨论】:

    • 如果您阅读 UTF-8,您会发现任何超过 7F 的单字节值都必须编码为两个字符,并且第一个将始终设置其高位。所以,是的,A0 始终编码为 C2 A0,这意味着您不能逐字节进行。使用quoted-encoding处理UTF-8的正确方法是先解码引用的部分,然后解码UTF-8,得到一个由2字节字符组成的字符串(技术上是UCS-16或UTF-16)。跨度>
    • 谢谢史蒂文。我会继续购买它,因为我厌倦了把这些垃圾混在一起。 :)
    • 实际上,我喜欢编写 MIME 解析器之类的东西,但我根本无法证明花费数天时间来生产具有廉价、可靠的第三方功能一小部分的东西——党的控制。即使我得到最低工资,也不划算。
    •  是这个的HTML代码,顺便说一句。以防万一有人关心。
    • @StevenSudit 上面的评论中有几个技术错误。 UTF-8 是一种可变 宽度编码:U+7F 以上的代码点用至少 2 个字节编码,但可能需要 3 或 4 个字节,具体取决于被编码的值. UCS-2(不是UCS-16)是一个固定宽度的16位编码,但不能编码所有的Unicode,并且已经很少使用了。更常用的 UTF-16 是另一种可变宽度编码,字符占用 2 或 4 个字节。要以固定宽度编码表示所有 Unicode 代码点,您需要 4 字节 UCS-4。
    【解决方案2】:

    %C2%A0 是非中断空格

    【讨论】:

      【解决方案3】:

      %C2%A0 这是一个隐藏文件夹的代码,创建一个隐藏文件夹并保存在其中,例如一个文本文件,然后通过浏览器打开这个文件,你会在搜索栏中看到这些字符。据我了解,这些字符是可选的,不会转换为其他代码。

      【讨论】: