c# - HttpClient.PostAsync 的字符编码问题
问题描述
我们有一个旧版网络应用程序,可以在浏览器中手动运行。当我尝试使用 http 帖子在代码中使用相同的 Web 应用程序时,我得到一些土耳其语字符为?。
我有以下代码来发布 http 帖子:
var httpClient = new HttpClient(); //static readonly in real code
var content = new StringContent("id_6=some text with Turkish characters öçşığüÖÇŞİĞÜ", Encoding.GetEncoding("ISO-8859-9"), "application/x-www-form-urlencoded");
var response = httpClient.PostAsync(url, content).Result; //I know this is not a good way, I'll focus on it later
var responseInString = response.Content.ReadAsStringAsync().Result;
File.WriteAllText("c:\\temp\\a.htm", responseInString);
Web 应用程序返回一个带有一些输入值的 html,包括我的代码发布的那些。我的代码发布的表单值和使用我的值计算的表单值的土耳其语字符不好,而带有土耳其语字符的硬编码提交按钮看起来还不错。
Web 应用程序将此 html(为简单起见已截断)返回到我的代码:
<!-- BELOW IS THE HARDCODED FORM FIELD WITH TURKISH CHARS OK! DISPLAYED AS: Programı Çağır -->
<input type="submit" value="Programı Çağır" name="j_id_jsp_262293626_16"/>
<!-- IRRELEVANT HTML REMOVED -->
<!-- BELOW IS THE OUTPUT FORM FIELD WITH CHAR ş BAD! DISPLAYED AS: some text with Turkish characters öç???üÖÇ???Ü -->
<input type="text" value="some text with Turkish characters öç???üÖÇ???Ü" id="id_2" name="id_2"/>
<!-- BELOW IS THE INPUT FORM FIELD WITH CHAR ş BAD! -->
<input type="text" value="some text with Turkish characters öç???üÖÇ???Ü" id="id_6" name="id_6" />
有什么问题?
编辑:发布到示例表单的类似代码可以正常工作:
static readonly HttpClient httpClient = new HttpClient();
[TestMethod]
public void TestHttpClientForTurkish()
{
var data = new Dictionary<string, string>()
{
{"fname", "öçşığü" },
{"lname", "ÖÇŞİĞÜ" }
};
var content = new FormUrlEncodedContent(data);
var response = httpClient.PostAsync("https://www.w3schools.com/action_page.php", content).Result;
var responseInString = response.Content.ReadAsStringAsync().Result;
Assert.IsTrue(responseInString.Contains("öçşığü") && responseInString.Contains("ÖÇŞİĞÜ"));
}
解决方案
我的发现:
- FormUrlEncodedContent 类不支持 Encoding 参数(因此不能处理土耳其语字符),所以我不得不使用 StringContent
- 我不得不使用 HttpUtility.UrlEncode 对表单值进行编码(并使用 ISO-8859-9 作为编码)。
这是表单字段中土耳其语字符没有任何问题的最终代码:
var httpClient = new HttpClient(); //static readonly in real code
var iso = Encoding.GetEncoding("ISO-8859-9");
var content = new StringContent("id_6="+
HttpUtility.UrlEncode("some text with Turkish characters öçşığüÖÇŞİĞÜ", iso), iso,
"application/x-www-form-urlencoded");
var response = httpClient.PostAsync(url, content).Result;//Using Result because I don't have a UI thread or the context is not ASP.NET
var responseInString = response.Content.ReadAsStringAsync().Result;
File.WriteAllText("c:\\temp\\a.htm", responseInString);
推荐阅读
- list - 在 VS 代码中找到一个单词并将其替换为列表
- javascript - vue单文件组件加载样式失败
- spring-boot - 当我尝试通过无服务器架构将 Spring Boot 应用程序实现为 AWS lambda 时,我正面临 ClassNotFoundException
- gradle - Ansible 不运行 gradlew 任务
- python - 为什么python gzip会引发关闭文件错误?
- python - 如何对大型稀疏线性系统执行线性求解
- r - 如何在 R 的回归输出中显示变量的名称(存储在列表中)?
- javascript - Javascript addEventListener 在某些情况下不工作,但在其他情况下工作
- angular - 在 Angular 中输入只能包含 13 个数字
- amazon-web-services - SageMaker SkLearn - 模型保存到提供的存储桶,而不是完整的提供路径