向DirectLine发送含特殊字符的Activity时乱码问题求助
问题分析与解决:特殊字符发送到DirectLine后变为问号
你遇到的问题根源非常清晰——代码里的ASCII编码处理直接破坏了UTF-8特殊字符的传输!
看你代码里这行关键错误:
string ansistring = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(serializedJson));
ASCII编码只支持0-127的字符,像“煤”这种非ASCII字符根本不在它的支持范围内。当你用Encoding.ASCII.GetBytes处理包含“煤”的字符串时,这个字符会被直接替换成ASCII的问号(?),后续再转成字符串也没法恢复,所以Bot收到的自然是Men? principal。
修复方案
只需要做几个简单的调整就能解决问题:
- 移除多余的ASCII转换步骤:你的
serializedJson已经是正确的UTF-8格式字符串,完全不需要转成ASCII。 - 强制WebClient使用UTF-8编码:WebClient默认编码可能不是UTF-8,需要明确设置。
- 在Content-Type头中指定UTF-8字符集:告诉DirectLine服务器你发送的内容编码是UTF-8,避免解析错误。
修改后的完整函数代码:
public static T uploadString<T>(string bearer, string url, string serializedJson) { string serializedResult = ""; using (var client = new WebClient()) { try { // 设置WebClient使用UTF-8编码,确保特殊字符正确传输 client.Encoding = Encoding.UTF8; // 添加请求头,明确指定JSON的字符集为UTF-8 client.Headers.Add("Content-Type", "application/json; charset=utf-8"); client.Headers.Add("Authorization", $"Bearer {bearer}"); // 直接上传原始的serializedJson,无需ASCII转换 serializedResult = client.UploadString(url, serializedJson); } catch (Exception e) { string a = e.Message; } } return JsonConvert.DeserializeObject<T>(serializedResult); }
额外检查点
- 确认Json.NET序列化过程没问题:你的
serializedJson里"text":"Men煤 principal"是正确的,说明序列化环节没有问题,问题完全出在传输时的编码处理。 - 可以用抓包工具验证修改后的请求,确认“煤”字符在请求体中是正确传输的,没有被替换成问号。
这样修改后,DirectLine就能正确接收包含特殊字符的消息,Bot也会做出正确的响应了。
内容的提问来源于stack exchange,提问作者Emiliano Montesdeoca
相关产品推荐
相关产品推荐

