POST activity 直线中有特殊字符

POST activity with special characters in Direct Line

最后的TLDR

目前我需要POST一个ActivityDirectLine发送一个特殊字符的消息,字符串是Menú principal,请注意ú。其他一切正常,但发送特殊字符让我哭泣。

但是当我发送序列化的 activity 时,它会显示一个 ?,所以你可以看到 Menú principal != Men? principal 这将使机器人回答不同。

我已经尝试了一些方法,但似乎没有用,这是我目前 POST.

的功能
    /// <summary>
    /// Uploads to an URL and gets result
    /// </summary>
    /// <typeparam name="T">Type of object you are receiving</typeparam>
    /// <param name="bearer">Token</param>
    /// <param name="url">Url</param>
    /// <param name="serializedJson">Serialized JSON to send</param>
    /// <returns></returns>
    public static T uploadString<T>(string bearer, string url, string serializedJson)
    {
        string serializedResult = "";

        /// Webclient
        using (var client = new WebClient())
        {
            /// Looks like it goes wrong when uplading UTF8 words
            string ansistring = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(serializedJson));

            try
            {
                /// Add headers
                client.Headers.Add("Content-Type", "application/json");
                client.Headers.Add("Authorization", $"Bearer {bearer}");

                /// Upload string
                serializedResult = client.UploadString(url, ansistring);
            }
            catch (Exception e)
            {
                string a = e.Message;
            }
        }

        /// Get result and return it as an object
        return JsonConvert.DeserializeObject<T>(serializedResult);
    }

参数 serializedJson 是一个使用 Json.NET 序列化的 Activity 对象,当我尝试发送 Menú principal.

时它看起来像这样

serializedJson = "{\"type\":\"message\",\"id\":\"c5908d50-5389-11e8-bd5c-45bb8f0ca339\",\"timestamp\":\"2018-05-09T13:06:22.49+00:00\",\"localTimestamp\":null,\"serviceUrl\":null,\"channelId\":null,\"from\":{\"id\":\"default-user\",\"name\":\"User\"},\"conversation\":null,\"recipient\":null,\"textFormat\":\"plain\",\"attachmentLayout\":null,\"membersAdded\":null,\"membersRemoved\":null,\"reactionsAdded\":null,\"reactionsRemoved\":null,\"topicName\":null,\"historyDisclosed\":null,\"locale\":\"es\",\"text\":\"Menú principal\",\"speak\":null,\"inputHint\":null,\"summary\":null,\"suggestedActions\":null,\"attachments\":[],\"entities\":[],\"channelData\":{\"clientActivityId\":\"1525870846394.1792692356311325.10\"},\"action\":null,\"replyToId\":null,\"value\":null,\"name\":null,\"relatesTo\":null,\"code\":null,\"expiration\":null,\"importance\":null,\"deliveryMode\":null,\"textHighlights\":null}"

如您所见,text"text\":\"Menú principal\"

在对话中看到 Activity 日志后,它将 ú 显示为 ?

您可以在 this repository, the uploadString function is in this class and the test cases are in this 文件中找到完整代码。

TLDR:我需要发送 Menú principal 到 DirectLine,当它到达机器人时,它显示如下:Men? principal

该字符不是有效的 ASCII 字符。尝试对您的字符串使用 Unicode 编码:

var stringToSend = Encoding.Unicode.GetString(Encoding.Unicode.GetBytes("Menú principal"));