gpt4 book ai didi

c# - 如何以正确的编码从 HttpRequest 表单数据中读取字符串

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:20 25 4
gpt4 key购买 nike

今天我做了一项服务来接收来自 SendGrid 的电子邮件,并最终发送了一封包含“At long last”文本的电子邮件,这是在测试期间第一次使用非英语语言。不幸的是,编码已成为我无法修复的问题。

在 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 Controller 中获取原始 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!
}

最佳答案

针对我的问题发现了两个潜在问题。

第一个来自 SendGrid - 他们发布多部分数据而不指定非 unicode 元素的内容类型。

第二个来自 ServiceStack - 目前它不支持 utf-8 以外的多部分数据编码。

更新:

SendGrid 服务台 promise 会调查这个问题,ServiceStack 现在完全支持多部分数据中的自定义字符集。

至于最初的问题本身,可以按照此处所述访问 ServiceStack 中的缓冲流:Can ServiceStack Runner Get Request Body? .

关于c# - 如何以正确的编码从 HttpRequest 表单数据中读取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18615519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com