You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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。

修复方案

只需要做几个简单的调整就能解决问题:

  1. 移除多余的ASCII转换步骤:你的serializedJson已经是正确的UTF-8格式字符串,完全不需要转成ASCII。
  2. 强制WebClient使用UTF-8编码:WebClient默认编码可能不是UTF-8,需要明确设置。
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:06