将十六进制值转换为 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-printable
和 base64
。有关详细信息,请查看 RFC 2045、2046、2047 和 2048。
- 撤消
Content-Transfer-Encoding
以得到包含字节序列的字节流。
- 看
Content-Type
header,charset
参数
- 使用上面找到的 codec/charset/... 解码字节流。
- 恭喜,您现在有了 Unicode 字符串。
或者,使用在您最喜欢的 language/framework 中实现这些功能的库。有很多。
我正在使用 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-printable
和base64
。有关详细信息,请查看 RFC 2045、2046、2047 和 2048。 - 撤消
Content-Transfer-Encoding
以得到包含字节序列的字节流。 - 看
Content-Type
header,charset
参数 - 使用上面找到的 codec/charset/... 解码字节流。
- 恭喜,您现在有了 Unicode 字符串。
或者,使用在您最喜欢的 language/framework 中实现这些功能的库。有很多。