【问题标题】:UTF8 to ASCII conversion in C#C# 中的 UTF8 到 ASCII 转换
【发布时间】:2019-10-31 03:01:37
【问题描述】:

我知道已经有一个非常相似的问题here,但不幸的是,上面的答案对我没有帮助。

我想通过Unity Webrequest 将一些数据POST 发送到 RESTful Web 服务。正如the documentation 所说,

postData 中的数据会被转义,然后解释成一个字节 通过 System.Text.Encoding.UTF8 流式传输。

postData 中的数据以 JSON 格式存储。远程 Web 服务将使用 NewtonSoft.Json 反序列化所有传入数据。

不幸的是,远程 Web 服务抛出了一个JsonReaderException,并带有消息"Unexpected character encountered while parsing value: %. Path '', line 0, position 0." 这是因为发布的数据看起来像这样的字符串(被截断):

%7b%22LogType%22%3a%22Drill%22%2c%22Action%22%3a%22Started%22%2c%22Description%22%3a%22...

在调用Newtonsoft.Json 库对其进行反序列化之前,我尝试将传入的数据从 UTF-8 转换为 ASCII:

byte[] contentBytes = await Request.Content.ReadAsByteArrayAsync();
string postContents = Encoding.ASCII.GetString(Encoding.Convert(Encoding.UTF8, Encoding.ASCII, contentBytes));

但是,JsonReaderException 仍然被抛出,因为 postContents 仍然看起来像这样:

%7b%22LogType%22%3a%22Drill%22%2c%22Action%22%3a%22Started%22%2c%22Description%22%3a%22...

我应该怎么做才能确保远程 Web 服务能够成功反序列化它接收到的数据?

【问题讨论】:

  • 我认为您的数据在传输过程中变成了 URL 编码。忘记 ASCII,那只会是另一个问题。
  • The data in postData will be escaped...
  • 尽可能发布所有相关的 C# 代码、客户端和服务器。
  • Unity 在这里将正文发布为x-www-form-urlencoded 类型并没有帮助,服务器显然不愿意解释。根据我从文档中收集到的信息,您不能使用静态便捷方法,您需要构造一个显式 UnityWebRequest 实例并将 uploadHandler 设置为 RawUploadHandler 实例(假设您不能修改服务器代码来处理表单)。
  • @JeroenMostert 说到 web 请求,Unity 似乎还在 2001 年

标签: c# .net unity3d encoding json.net


【解决方案1】:

您收到的数据是URL encoded

例如:

  • %7b{
  • %22"
  • %3a:

所以接收到的 URL 编码字符串的开头是这样的:

{"LogType":"Drill"

这显然是一个有效的 JSON 字符串。

所以,你需要做的就是将url decode它转换成一个常规的JSON字符串,然后使用JSON.NET对其进行反序列化。

【讨论】:

  • 问题是OP在发送这个,对方要解码。
  • @HenkHolterman 该评论没有多大意义。 OP的代码既发送又接收,可以任意端处理
  • 实际上并不清楚谁拥有那个“远程网络服务”。不过,这个问题确实集中在客户身上。
猜你喜欢
  • 2011-05-20
  • 2023-03-31
  • 2018-05-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2013-10-02
相关资源
最近更新 更多