在 .netcore2.1 web-api 中发布重音字符
Posting accented characters in .netcore2.1 web-api
我正在 .net core 2.1 (C#) 中做一个 web-api,我在 POST 请求中发送重音字符时遇到了问题。
到目前为止,我已经尝试了两种不同的方法:使用 FormUrlEncodedContent 和 StringContent 构建将 posted 的内容。我使用了 https://pt.whosebug.com/questions/121713/applicationx-www-form-urlencoded-com-httpwebrequest 中的参考资料(葡萄牙语)。
我想由于某种原因我在使用 UTF-8 编码时遇到了问题。
使用 FormUrlEncodedContent:
var values = new List<KeyValuePair<string, string>>();
object[] myKeys = new object[content.DsValues.Count];
object[] myValues = new object[content.DsValues.Count];
content.DsValues.Keys.CopyTo(myKeys, 0);
content.DsValues.Values.CopyTo(myValues, 0);
foreach (object value in myValues)
{
values.Add(new KeyValuePair<string, string>("value", value.ToString()));
}
foreach (object key in myKeys)
{
values.Add(new KeyValuePair<string, string>("field", key.ToString()));
}
values.AddRange(content.Values);
var string_message = new FormUrlEncodedContent(values).ReadStringAsync();
var postRequest = Encoding.UTF8.GetBytes(string_message);
request.ContentLength = postRequest.Length;
var stream = request.GetRequestStream();
stream.Write(postRequest, 0, postRequest.Length);
stream.Close();
使用 StringContent:
var formurlstring = "";
foreach(object value in myValues)
{
formurlstring = formurlstring + "value=" + value.ToString() + "&";
}
foreach(object key in myKeys)
{
formurlstring = formurlstring + "field=" + key.ToString() + "&";
}
var encoded = formurlstring.Replace(" ", "+");
var string_message = new StringContent(HttpUtility.UrlEncode(encoded));
var postRequest = Encoding.UTF8.GetBytes(string_message);
request.ContentLength = postRequest.Length;
var stream = request.GetRequestStream();
stream.Write(postRequest, 0, postRequest.Length);
stream.Close();
据我检查,FormUrlEncodedContent 返回的字符串已经编码了重音字符,而我从 StringContent 恢复的字符串仍然有重音字符。我可以 post 将它们都发送到外部 Web 应用程序,但是每当我去检查我 post 编辑的内容时,重音字符都不正确。我会期待这样的事情:
COMESTÍVEL
但是每当我去网站上查看 posted 的内容时,都是这样的:
科梅斯特
在此先感谢您的回复,如果我忘记了有关代码的一些信息,我们深表歉意。
确保您的 post 请求的 Content-Type
header 包含 mime-type 和 charset=UTF-8
。现在,它被解释为 ASCII (latin-1)。
终于调试下来了
因此,由于我使用的是 ISO-8859-1,因此我不得不更改编码方法以适应它。每当我尝试使用 FormUrlEncodeContent 或 StringContent 创建要上传的内容时,所使用的编码都不正确。
因此,我没有使用这些方法来创建我的内容,而是在循环内创建并发送回纯字符串,然后使用正确的编码方法对其进行编码。
var formurlstring = "";
foreach(object value in myValues)
{
formurlstring = formurlstring + "value=" + value.ToString() + "&";
}
foreach(object key in myKeys)
{
formurlstring = formurlstring + "field=" + key.ToString() + "&";
}
var string_message = formurlstring.Replace(" ", "+");
var enc8859 = Encoding.GetEncoding(28591);
var postRequest = enc8859.GetBytes(string_message);
request.ContentLength = postRequest.Length;
var stream = request.GetRequestStream();
stream.Write(postRequest, 0, postRequest.Length);
stream.Close();
可能有更好的方法。我确实想将它与 FormUrlEncodedContent 一起使用,这样更简单、更清晰,但由于我无法...
我正在 .net core 2.1 (C#) 中做一个 web-api,我在 POST 请求中发送重音字符时遇到了问题。
到目前为止,我已经尝试了两种不同的方法:使用 FormUrlEncodedContent 和 StringContent 构建将 posted 的内容。我使用了 https://pt.whosebug.com/questions/121713/applicationx-www-form-urlencoded-com-httpwebrequest 中的参考资料(葡萄牙语)。 我想由于某种原因我在使用 UTF-8 编码时遇到了问题。
使用 FormUrlEncodedContent:
var values = new List<KeyValuePair<string, string>>();
object[] myKeys = new object[content.DsValues.Count];
object[] myValues = new object[content.DsValues.Count];
content.DsValues.Keys.CopyTo(myKeys, 0);
content.DsValues.Values.CopyTo(myValues, 0);
foreach (object value in myValues)
{
values.Add(new KeyValuePair<string, string>("value", value.ToString()));
}
foreach (object key in myKeys)
{
values.Add(new KeyValuePair<string, string>("field", key.ToString()));
}
values.AddRange(content.Values);
var string_message = new FormUrlEncodedContent(values).ReadStringAsync();
var postRequest = Encoding.UTF8.GetBytes(string_message);
request.ContentLength = postRequest.Length;
var stream = request.GetRequestStream();
stream.Write(postRequest, 0, postRequest.Length);
stream.Close();
使用 StringContent:
var formurlstring = "";
foreach(object value in myValues)
{
formurlstring = formurlstring + "value=" + value.ToString() + "&";
}
foreach(object key in myKeys)
{
formurlstring = formurlstring + "field=" + key.ToString() + "&";
}
var encoded = formurlstring.Replace(" ", "+");
var string_message = new StringContent(HttpUtility.UrlEncode(encoded));
var postRequest = Encoding.UTF8.GetBytes(string_message);
request.ContentLength = postRequest.Length;
var stream = request.GetRequestStream();
stream.Write(postRequest, 0, postRequest.Length);
stream.Close();
据我检查,FormUrlEncodedContent 返回的字符串已经编码了重音字符,而我从 StringContent 恢复的字符串仍然有重音字符。我可以 post 将它们都发送到外部 Web 应用程序,但是每当我去检查我 post 编辑的内容时,重音字符都不正确。我会期待这样的事情:
COMESTÍVEL
但是每当我去网站上查看 posted 的内容时,都是这样的: 科梅斯特
在此先感谢您的回复,如果我忘记了有关代码的一些信息,我们深表歉意。
确保您的 post 请求的 Content-Type
header 包含 mime-type 和 charset=UTF-8
。现在,它被解释为 ASCII (latin-1)。
终于调试下来了
因此,由于我使用的是 ISO-8859-1,因此我不得不更改编码方法以适应它。每当我尝试使用 FormUrlEncodeContent 或 StringContent 创建要上传的内容时,所使用的编码都不正确。
因此,我没有使用这些方法来创建我的内容,而是在循环内创建并发送回纯字符串,然后使用正确的编码方法对其进行编码。
var formurlstring = "";
foreach(object value in myValues)
{
formurlstring = formurlstring + "value=" + value.ToString() + "&";
}
foreach(object key in myKeys)
{
formurlstring = formurlstring + "field=" + key.ToString() + "&";
}
var string_message = formurlstring.Replace(" ", "+");
var enc8859 = Encoding.GetEncoding(28591);
var postRequest = enc8859.GetBytes(string_message);
request.ContentLength = postRequest.Length;
var stream = request.GetRequestStream();
stream.Write(postRequest, 0, postRequest.Length);
stream.Close();
可能有更好的方法。我确实想将它与 FormUrlEncodedContent 一起使用,这样更简单、更清晰,但由于我无法...