windows - UrlUnescape() 和 unicode 字符

标签 windows winapi url unicode

我正在尝试用 C++ 编写程序,该程序将解码包含一些 URL 编码的 unicode 字符的 URL 编码字符串。

#include <windows.h>
#include <string>
#include <shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring test = L"bla+%D0%B1%D0%BB%D0%BE%D1%84+%E6%97%A5%E6%9C%AC%E8%AA%9E";
    PWSTR urlencodedStr = const_cast<WCHAR*>(test.c_str());
    WCHAR decodedStr[1025];
    DWORD size = 1024;
    HRESULT hres = UrlUnescape(urlencodedStr, decodedStr, &size, NULL);

    if (hres == S_OK)
        MessageBox(NULL, decodedStr, L"decoded string", MB_OK);

    return 0;
}

我期待在decodedStr中得到L“bla блоф 日本语”。但我得到的是 L"bla+блÐ⁄Ñ„+æ—¥æœØ語”。 我在构建中使用 unicode 字符集。 我做错了什么?

最佳答案

UrlUnescape 默认情况下使用默认 (ANSI) 代码页将 URL 解码的 %xx 字节转换为字符。这几乎从来都不是您想要的。

从 Windows 8 开始,您可以传递 UNESCAPE_AS_UTF8标志以使其表现良好。如果您不能依赖 Win8,则必须使用/编写一个不存在此问题的不同 URL 解码库调用。

还有 + 的问题:在 plain-URL-encoding 中(例如在路径部分中使用),这意味着加号,但在 form-url-encoding 中(例如查询参数中的示例),这就是您在这里看到的,它意味着一个空格。一个好的 URL 解码器可以让您选择说出您的意思; UrlUnescape 没有。另一种方法是在 URL 解码之前手动将输入中的 + 替换为空格;这是一种特殊情况,其他角色不会受到类似影响。

关于windows - UrlUnescape() 和 unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080078/

相关文章:

mysql - 更改 InnoDB 池大小而不影响本地服务器 - MySQL windows

windows - 如何复制目录结构但只包含某些文件(使用 Windows 批处理文件)

node.js - 将 Node.js 应用程序分发为单个跨平台可执行文件

c++ - 在 CArray 中赋值的简单方法

http - 网址重定向;用于一般用途,最好是 : server-side or client-side?

c++ - WinMain 和 wWinMain 的区别

python - 如何将非英语 Windows 时区名称映射到 Python 中的 Olsen 名称?

c++ - Windows控制台下使用UTF-8输出的printf和std::ostream有什么区别

java - 在 Java 中使用 Apache HTTP 处理丢失的资源

javascript - 找出使用 Jquery 从网站获取网站名称的通用方法