首页 > 解决方案 > 如何使用糟糕的 Windows 套接字在 https GET 请求中发送包含 unicode 字符的 cookie

问题描述

我正在创建 win32 应用程序,并使用一个特定的站点。从以前的请求中,我提取了一些 cookie,我想实现它们。但问题是,其中一个 cookie 包含 unicode 字母(latyn 小写字母 e,上面带有点;ASCII 表中的 279)。它是唯一一个 url 编码的 cookie。解码时,我得到 char \u0117 并且 Visual Studio 编译器警告我它是 unicode char 并将其视为?标记。

这是 url 编码的 cookie:

Set-Cookie: logged_user=%7B%22id%22%3A%22625936%22%2C%22email%22%3A%22vytautas.leveris%40gmail.com%22%2C%22display_name%22%3A%22Vytautas+L%5Cu0117veris%22%2C%22full_name%22%3A%22Vytautas+L%5Cu0117veris%22%2C%22photo%22%3A%22https%3A%5C%2F%5C%2Fwww.15min.lt%5C%2Fassets%5C%2Fimages%5C%2Fuser-default-icon.png%22%2C%22photo_small%22%3A%22https%3A%5C%2F%5C%2Fwww.15min.lt%5C%2Fassets%5C%2Fimages%5C%2Fuser-default-icon.png%22%2C%22photo_normal%22%3A%22https%3A%5C%2F%5C%2Fwww.15min.lt%5C%2Fassets%5C%2Fimages%5C%2Fuser-default-icon.png%22%2C%22staff%22%3Afalse%2C%22bookmarks%22%3A2%2C%22nb%22%3A1%7D; path=/

这是 url 解码的 cookie:

Set-Cookie: logged_user={\"id\":\"625936\",\"email\":\"vytautas.leveris@gmail.com\",\"display_name\":\"Vytautas L\u0117veris\",\"full_name\":\"Vytautas L\u0117veris\",\"photo\":\"https:\/\/www.15min.lt\/assets\/images\/user-default-icon.png\",\"photo_small\":\"https:\/\/www.15min.lt\/assets\/images\/user-default-icon.png\",\"photo_normal\":\"https:\/\/www.15min.lt\/assets\/images\/user-default-icon.png\",\"staff\":false,\"bookmarks\":2,\"nb\":1}; path=/

最后,所有 http GET 请求:

strcpy(request,"GET / HTTP/1.1\r\nHost: www.15min.lt\r\nCookie: PHPSESSID=652e6dd2ac78de5db5392e53b9a0355a; logged_user={\"id\":\"625936\",\"email\":\"vytautas.leveris@gmail.com\",\"display_name\":\"Vytautas L\u0117veris\",\"full_name\":\"Vytautas L\u0117veris\",\"photo\":\"https:\/\/www.15min.lt\/assets\/images\/user-default-icon.png\",\"photo_small\":\"https:\/\/www.15min.lt\/assets\/images\/user-default-icon.png\",\"photo_normal\":\"https:\/\/www.15min.lt\/assets\/images\/user-default-icon.png\",\"staff\":false,\"bookmarks\":2,\"nb\":1}; remember_me=625936; device_token_625936=84c45e719fedc5949ced93ca0df54152\r\nUser-Agent: WindowsSockets2\r\n\r\n");

当我通过 winsock 发送消息时,我使用 char 类型。

我需要将所有内容都转换为 wchar_t* 吗?但是那么将 wchar_t* 发送到服务器呢?或者也许我可以将这个字符表示 \u0117 更改为 UTF8 字符序列?欢迎任何帮助和评论。

标签: c

解决方案


我建议将数据视为不透明的字节序列,即将自定义数据转换为 UTF-8 字节,运行 base 64 并将其用作 cookie 值。另请参阅:https ://stackoverflow.com/a/49205256/696632 。然后在接收端反向操作。您可能需要unsigned char*不透明的字节数据。


推荐阅读