【问题标题】:StreamReader reads \u00fc but Postman reads OKStreamReader 读取 \u00fc 但 Postman 读取正常
【发布时间】:2020-05-15 09:59:06
【问题描述】:

可能重复的问题,但我找不到我的问题的答案。我有这个代码来调用网络服务:

        var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://172.21.122.1:5001/autocomplete");

        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";
        //tried this too: httpWebRequest.Accept = "gzip, deflate";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write("{ \"message\" : \"mü\" }");
            streamWriter.Flush();
            streamWriter.Close();
        }

        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

        response = "";
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            response = streamReader.ReadToEnd();
        }

但无论我用 StreamReader() c'tor 尝试什么编码,我都会得到这个响应或更糟:{"words":["m\u00fc\u015fteri","m\u00fc\u015fterisiyim""]}

当我使用 Postman 或 SoapUI 以相同的请求调用相同的服务时:{"message": "mü"}, 响应看起来不错:{"words": ["müşteri","müşterisiyim"]}

奇怪的是:相同的代码适用于许多其他服务。只有这个特定的服务才没有正确编码响应。我们认为该服务存在编程错误,但我想知道 Postman 或 SoapUI 是如何处理这个问题的。他们的代码中应该有一个控件,如果响应包含“\uxxxx”,那么 Postman 或 SoapUI 会再次对其进行解码。

我检查了 Postman 和 SoapUI 中的所有请求/响应标头,但没有运气。可能是什么原因?

【问题讨论】:

  • 我注意到你实际上并没有在看 Postman 中的 Body ...? Postman 屏幕截图仅显示标题,但 C# 正在尝试读取正文
  • 您的响应正文看起来也很合理:它以{"words": [" 开头,这是有效的 JSON,很可能意味着字符编码很好,没有压缩等。字符串本身也可能没问题:如果你用它们所代表的实际字符替换 \uxxxx,你会得到 müşerimüşterisiyim,谷歌翻译告诉我这是有效的土耳其语
  • 请求对象长什么样子?如果您从外部某处加载“单词”内容,则可能存在编码问题。
  • 我已经编辑了问题并添加了我在代码和 Postman 中使用的请求/响应。
  • Regex.Unescape(response) 甚至 response = Regex.Unescape( streamReader.ReadToEnd()); 会解决问题吗?

标签: unicode character-encoding postman soapui fallback


【解决方案1】:

您必须确保您的请求编码正确: 将内容类型设置为:

httpWebRequest.ContentType = "application/json;charset=UTF-8";

检查请求正文是否也是 UTF-8 编码的。也将 StreamWriter 编码设置为 UTF-8:

...

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.UTF8))

...

如果您从其他来源获取请求内容,请确保也使用 UTF-8 编码读取它。

【讨论】:

  • 我不认为这是正确的:正如 cmets 中所讨论的,响应看起来格式正确
  • 是的,响应格式正确,问题是编码错误。
  • 我不认为是这样——你可以看到它以有效的 JSON 开头。如果编码错误,就不会发生这种情况。
  • 这不起作用:响应看起来仍然相同:{"words":["m\u00fc\u015fteri","m\u00fc\u015fterisiyim""]}
  • 尝试将 StreamWriter 编码也设置为 UTF-8。
【解决方案2】:

Regex.Unescape(response) 就像一个魅力,感谢 JosefZ!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多