【问题标题】:How can I convert webpage unicode to ascii?如何将网页 unicode 转换为 ascii?
【发布时间】:2019-01-25 16:45:56
【问题描述】:

我正在尝试将网页从我不理解的格式转换为 ascii,以便查找某些数据。我使用带有网页 url 的 webclient 检索数据,然后使用编码将数据从我认为的 unicode 转换为 ascii,但格式根本没有改变。以下是我的代码:

WebClient web = new WebClient();
string page = "https://www.myurl.com/";

Stream data = web.OpenRead(page);
StreamReader reader1 = new StreamReader(data);
string input = reader1.ReadToEnd();
Encoding unicode = Encoding.Unicode;
Encoding ascii = Encoding.ASCII;

string webpage = ascii.GetString(
  Encoding.Convert(unicode, ascii, unicode.GetBytes(input))
);

以下是网页数据的样子,与输入数据相同,这表明我的转换无效。

     \"sprited\":true,\"spriteCssClass\":\"sx_a11c08\",\"spriteMapCssClass\":\"sp_SN-oNOqlzVS\"},\"505789\":{\"sprited\":true,\"spriteCssClass\":\"sx_5219b1\",\"spriteMapCssClass\":\"sp_SN-oNOqlzVS\"},\"505782\":{\"sprited\":true,\"spriteCssClass\":\"sx_c0671f\",\"spriteMapCssClass\":\"sp_SN-oNOqlzVS\"},\"505794\":{\"sprited\":true,\"spriteCssClass\":\"sx_8cf344\",\"spriteMapCssClass\":\"sp_SN-oNOqlzVS\"},\"495429\": 

有谁知道这是什么类型的数据以及如何将其转换为我可以理解的数据?当我在浏览器上显示网页的页面源时,这些奇怪的数据都没有出现。换句话说,我从 webclient 获得的数据看起来一点也不像浏览器上的页面源。

【问题讨论】:

  • 这看起来像是带有反斜杠转义的部分 JSON。如果可能,您能否提供您尝试访问的实际 URL?
  • 我不认为你有字符编码的问题,它不是字符如何表示为字节的问题。你的问题是,你期待 HTML 并且你得到了别的东西,看起来有点像 JSON。
  • 如果用 UTF8 编码,ASCII 范围看起来是一样的。
  • 我没有看到任何看起来像 unicode 的东西。你想改变什么?
  • 我正在使用我不想显示的用户 ID 访问我的 Facebook 页面。它是facebook.com/my id。有些数据看起来确实像网络数据,但不是全部。

标签: c# encoding webclient non-ascii-characters


【解决方案1】:

下面是完整的网页数据吗?两端看起来都不完整。对我来说,它看起来像 JSON 数据。您可以使用 JavaScriptSerializer 类将其转换为 C# 对象。

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test resultingData = (Test)json_serializer.DeserializeObject(your_data);

【讨论】:

  • 我只是展示了一小部分数据。这是一个大约 400K 字节的庞大数据。
  • 你的意思是什么? @Dave 这将创建一个 400Kb json 的对象没问题,顺便说一句,400kb 没那么大
  • @Dave,您上面的代码将所有数据加载到一个字符串中。
【解决方案2】:

如果您想从请求中读取 JSON,请执行 like here

var json = web.DownloadString(page);

然后你需要将字符串反序列化为一个对象,如果你知道响应的模型的类型,你可以这样做,让它ResponseType

using Newtonsoft.Json;

...

var result = JsonConvert.DeserializeObject<ResponseType>(json);

有一个名为Facebook 的 NuGet 包,您可以将其导入到您的项目中。这将为您提供一些可能与类型匹配的模型。


如果您不知道响应的类型,您可以这样做,

using Newtonsoft.Json.Linq;

...

var jObject = JObject.Parse(json);

那你可以use LINQ to query the object.

【讨论】:

  • 我将用户代理“Mozilla/4.0”添加到我的 webclient Headers 中,现在 webclient 结果不会让我阅读我的 Facebook 网页,给我一个打开的错误。如果我从标头中删除用户代理并尝试读取使用 json 阅读器返回的数据流,我会收到一条错误消息,指出它在位置 0 处发现错误。因此似乎无法正确读取 facebook 网页。我将尝试使用另一个网页进行测试,一切都按我的预期进行。
  • @Dave,这是一个新问题吗?我的回答假设您可以获得 JSON,就像在问题中一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2021-08-30
  • 2013-05-17
  • 2011-12-10
  • 1970-01-01
  • 2020-02-20
  • 2018-03-21
相关资源
最近更新 更多