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

时间:2015-02-26 12:58:05

标签: c# encoding utf-8 hex imap

我正在使用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);

decodeItem的期望值是Ö。但我真的不知道为什么Ö在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);

但decodeItem中的值是=

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

http://www.utf8-chartable.de/ U +00D6Öc396带有DIAERESIS的LATIN CAPITAL LETTER

这意味着您必须取走'='然后将其转换为UTF 8

我希望这会有所帮助。

问候亚历克斯

答案 2 :(得分:1)

在今天的大多数电子邮件中都没有Unicode。要获得Unicode文本,您必须执行以下操作:

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

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