今天我已经完成了接收来自SendGrid的电子邮件的服务,最后发送了一封电子邮件,其中包含“最后一次”文本,在测试期间第一次使用非英语语言。不幸的是,编码已经成为我无法解决的问题。
在ServiceStack服务中,我有一个字符串属性(在从SendGrid发布到服务的输入对象中),其编码与UTF8或Unicode(在我的情况下为KOI8-R)不同。
public class SengGridEmail : IReturn<SengGridEmailResponse>
{
public string Text { get; set; }
}
当我尝试将此字符串转换为UTF8时,我得到了???? s,可能是因为当我访问Text属性时,它已经转换为Unicode(.NET的内部字符串表示形式)。 This question and answer说明了这个问题。
我的问题是如何在ServiceStack服务或ASP.NEt MVC控制器中获取原始的KOI8-R字节,以便我可以将其转换为UTF8文本?
更新:
访问base.Request.FormData["text"]
无效
var originalEncoding = Encoding.GetEncoding("KOI8-R");
var originalBytes = originalEncoding.GetBytes(base.Request.FormData["text"]);
但是,如果我从原始发送的邮件中获取base64字符串并将其转换为byte [],然后将这些字节转换为UTF8字符串 - 它可以工作。 base.Request.FormData["text"]
已经是Unicode .NET字符串格式,或者(不太可能)它是SendGrid端的东西。
更新2 : 这是一个单元测试,显示正在发生的事情:
[Test]
public void EncodingTest()
{
const string originalString = "наконец-то\r\n";
const string base64Koi = "zsHLz87Fwy3Uzw0K";
const string charset = "KOI8-R";
var originalBytes = base64Koi.FromBase64String(); // KOI bytes
var originalEncoding = Encoding.GetEncoding(charset); // KOI Encoding
var originalText = originalEncoding.GetString(originalBytes); // this is initial string correctly converted to .NET representation
Assert.AreEqual(originalString, originalText);
var unicodeEncoding = Encoding.UTF8;
var originalWrongString = unicodeEncoding.GetString(originalBytes); // this is how the KOI string is represented in .NET, equals to base.Request.FormData["text"]
var originalWrongBytes = originalEncoding.GetBytes(originalWrongString);
var unicodeBytes = Encoding.Convert(originalEncoding, unicodeEncoding, originalBytes);
var result = unicodeEncoding.GetString(unicodeBytes);
var unicodeWrongBytes = Encoding.Convert(originalEncoding, unicodeEncoding, originalWrongBytes);
var wrongResult = unicodeEncoding.GetString(unicodeWrongBytes); // this is what I see in DB
Assert.AreEqual(originalString, result);
Assert.AreEqual(originalString, wrongResult); // I want this to pass!
}
答案 0 :(得分:1)
发现了我的问题的两个潜在问题。
第一个来自SendGrid - 它们发布多部分数据而不指定非unicode元素的内容类型。
第二个来自ServiceStack - 目前它不支持utf-8以外的编码用于多部分数据。
更新:
SendGrid帮助台承诺调查此问题,ServiceStack现在完全支持多部分数据中的自定义字符集。
至于初始问题本身,可以访问ServiceStack中的缓冲流,如下所述:Can ServiceStack Runner Get Request Body?。