【问题标题】:Converting hex value to utf-8 character将十六进制值转换为 utf-8 字符
【发布时间】:2015-04-28 20:51:24
【问题描述】:

我正在使用 IMAP 类来阅读电子邮件。当我的邮件正文包含 Ö IMAP 时返回十六进制值:=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中的值是=  

【问题讨论】:

  • 已经是utf-8了。但编码为文本而不是字节。该编码称为quoted-printable。现在你知道用谷歌搜索什么了,“.net decodequoted-printable text”。第一击很好。

标签: c# encoding utf-8 hex imap


【解决方案1】:

那个符号实际上是两个字节 (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 };

【讨论】:

    【解决方案2】:

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

    这意味着您必须去掉“=”,然后将其转换为 UTF 8

    我希望这会有所帮助。

    问候亚历克斯

    【讨论】:

      【解决方案3】:

      当今的大多数电子邮件中都没有 Unicode。为了得到一个 Unicode 文本,您必须执行以下操作:

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

      或者,使用以您喜欢的语言/框架实现这些功能的库。有很多。

      【讨论】:

        猜你喜欢
        • 2020-10-26
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2018-01-22
        相关资源
        最近更新 更多