将十六进制值转换为 utf-8 字符

Converting hex value to utf-8 character

我正在使用 IMAP class 阅读电子邮件。当我的邮件正文包含 Ö IMAP returns 时,十六进制值:=C3=96。如何将其转换为 utf-8 Ö?

我在想:

Encoding enc = Encoding.GetEncoding("UTF-8);
System.Byte[] ch = new System.Byte[1];

ch[0] = System.Convert.ToByte([hex value of Ö], 16);
var decodedItem = enc.GetString(ch);

其中 decodedItem 的预期值为 Ö。但我真的不知道为什么 Ö 在 IMAP 中转换为 =C3=96 并且我无法将其发送到 ToByte() 因为 =C3=96 不是真正的十六进制值。

我也试过这样做:

Encoding enc = Encoding.GetEncoding("UTF-8);
System.Byte[] ch = new System.Byte[1];

ch[0] = 214;
var decodedItem = enc.GetString(ch);

但 decodedItem 中的值是 = �

http://www.utf8-chartable.de/ U+00D6 Ö c3 96 带分音符的拉丁文大写字母 O

这意味着你必须去掉'='然后将其转换为UTF 8

希望对您有所帮助。

问候亚历克斯

该符号实际上是两个字节 (0xC3, 0x96),但您只分配了一个,并且分配了一个不同的字节 (214 = 0xD6)...

Encoding enc = Encoding.GetEncoding("UTF-8");
System.Byte[] ch = { 0xC3, 0x96 };

var decodedItem = enc.GetString(ch);

为了进一步澄清,0xD6 (214) 实际上是用于 Unicode,而不是 UTF-8,您可以通过更改调用和值以匹配 Unicode 值来实现它:

Encoding enc = Encoding.GetEncoding("Unicode");
System.Byte[] ch = { 0xD6, 0x00 };

今天的大多数 e-mails 都没有 Unicode。为了得到 Unicode 文本,您必须执行以下操作:

  • 查找消息的文本部分。可能有很多。请参阅 RFC 3501 中的 BODYSTRUCTURE
  • 检查 MIME headers(或 BODYSTRUCTURE 响应)以找出您正在查看的部分的 Content-Transfer-Encoding。最常见的编码是 quoted-printablebase64。有关详细信息,请查看 RFC 2045、2046、2047 和 2048。
  • 撤消 Content-Transfer-Encoding 以得到包含字节序列的字节流。
  • Content-Typeheader,charset参数
  • 使用上面找到的 codec/charset/... 解码字节流。
  • 恭喜,您现在有了 Unicode 字符串。

或者,使用在您最喜欢的 language/framework 中实现这些功能的库。有很多。