C# Gmail API返回的文本/普通内容编码不一致

C# Gmail API返回的文本/普通内容编码不一致,c#,email,gmail-api,mime,content-encoding,C#,Email,Gmail Api,Mime,Content Encoding,我正在尝试使用GMail API阅读多部分/混合电子邮件。 目标是将多部分/混合电子邮件的每个文本/普通部分(可能有许多,采用不同的编码)正确解码为C#字符串(即UTF-16): publicstaticstringdecodetextpart(Google.api.Gmail.v1.Data.MessagePart) { var content_type_header=part.Headers.FirstOrDefault(h=>string.Equals(h.Name,“content ty

我正在尝试使用GMail API阅读
多部分/混合
电子邮件。
目标是将
多部分/混合
电子邮件的每个
文本/普通
部分(可能有许多,采用不同的编码)正确解码为C#字符串(即UTF-16):

publicstaticstringdecodetextpart(Google.api.Gmail.v1.Data.MessagePart)
{
var content_type_header=part.Headers.FirstOrDefault(h=>string.Equals(h.Name,“content type”,StringComparison.OrdinalIgnoreCase));
if(content\u type\u header==null)
抛出新ArgumentException(“在电子邮件部分中找不到内容类型头”);
var content\u type=new System.Net.Mime.ContentType(content\u type\u header.Value);
if(!string.Equals(content_type.MediaType,“text/plain”,StringComparison.OrdinalIgnoreCase))
抛出新ArgumentException(“该部分不是文本/普通”);
返回Encoding.GetEncoding(content_type.CharSet).GetString(GetAttachmentBytes(part.Body));
}
GetAttachmentBytes
返回从GMail使用的源代码解码的原始附件字节,无需转换

我发现,在许多情况下,这会产生无效字符串,因为我为附件内容获取的原始字节似乎总是在UTF-8中,即使同一部分的
content-type
声明了其他内容

例如,给定电子邮件:

日期:。。。
发件人:。。。
答复:。。。
消息ID:。。。
致:。。。
主题:测试1文本文件
MIME版本:1.0
内容类型:多部分/混合;
边界=“------------0E50FC0802A2FCAA”
------------0E50FC0802A2FCAA
内容类型:文本/纯文本;字符集=windows-1251
内容传输编码:8比特
内容测试:西里尔文,Windows-1251(a,ÿ,æ)
------------0E50FC0802A2FCAA
内容类型:文本/纯文本;
name=“unrelated.txt”
内容传输编码:base64
内容处置:附件;
filename=“unrelated.txt”
VGHPCYBMAWXLIGRVZXMGBM90IgNbNRHAW4GDXNLZNVSIGLUZM9YBWF0AW9U
------------0E50FC0802A2FCAA--
,我成功地找到了第一部分,上面的代码在
System.Net.Mime.ContentType
的帮助下显示它是
charset=windows-1251
,然后
.GetString()
返回垃圾,因为
GetAttachmentBytes
返回的实际原始字节对应于UTF-8编码,而不是windows-1251

同样的情况也发生在

主题:测试2文本文件
MIME版本:1.0
内容类型:多部分/混合;
边界=“------------0B716C1D8123D8710”
------------0B716C1D8123D8710
内容类型:文本/纯文本;字符集=koi8-r
内容传输编码:8比特
含量测试:西里尔语,koi-8(Б,С,Б)
------------0B716C1D8123D8710
内容类型:文本/纯文本;
name=“unrelated.txt”
内容传输编码:base64
内容处置:附件;
filename=“unrelated.txt”
VGHPCYBMAWXLIGRVZXMGBM90IgNbNRHAW4GDXNLZNVSIGLUZM9YBWF0AW9U
------------0B716C1D8123D8710--
请注意,两封电子邮件中编码名称后括号中的三个测试字母是相同的,在Unicode中看起来像
(а,ж)
,但(正确地)由于编码不同,在上面引用的电子邮件正文表示中看起来是错误的

如果我“修复”了函数始终使用
Encoding.UTF8
而不是
GetEncoding(content\u type.CharSet)
,那么它在我迄今为止所做的测试中似乎是有效的

同时,GMail界面在这两种情况下都能正确显示字母,因此它必须使用正确声明的编码正确解析传入的电子邮件

GMail API是否将所有文本块重新编码为UTF-8(用base64url包装),但为它们报告原始的
charset
因此,我是否应该始终在GMail API中使用UTF-8,而忽略内容类型
charset=


或者我的代码有问题吗?

根据以下两个参考资料:

该值实际上是转换为UTF-8的零件的base-64编码表示


然而,据我所知,谷歌并未对此进行记录。

您有一个编码问题。编码基于语言标头:。您使用了错误的语言,这就是字符无法正确显示的原因,或者您的计算机没有正确的字体,而您的计算机正在替换其他字体。@jdweng没有HTML。引用的电子邮件也没有编码问题。它们在电子邮件客户端和GMail web界面中正确显示。您的电子邮件设置为html还是文本?你说“由于不同的编码,邮件正文看起来不对”。你有html@GSerg@CodeCaster我想这么做已经有六个月了,只是不知道如何让它听起来客观……谢谢!从第二个链接的“根据API文档,响应总是UTF-8编码”判断,显然有人找到了它。不过我也找不到。