2

URL エンコードされた Unicode 文字を含む URL エンコードされた文字列をデコードするプログラムを C++ で作成しようとしています。

#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+блоф+日本語" を取得しています。ビルドでユニコード文字セットを使用しています。私は何を間違っていますか?

4

2 に答える 2

2

UrlUnescape%xxデフォルトでは、デフォルト (ANSI) コード ページを使用して、URL でデコードされたバイトを文字に変換します。これはほとんどあなたが望むものではありません。

Windows 8 以降では、UNESCAPE_AS_UTF8フラグを渡して動作させることができます。Win8 に依存できない場合は、この問題に悩まされない別の URL デコード ライブラリ呼び出しを使用または作成する必要があります。

また、+: プレーン URL エンコーディング (パス部分での使用など) では、これはプラスを意味しますが、フォーム URL エンコーディング (クエリ パラメータなど) では、これはここにあるようで、スペースを意味します。優れた URL デコーダーは、どちらを意味するかを示すオプションを提供します。UrlUnescapeではない。+別の方法として、URL デコードの前に、入力の を手動でスペースに置き換えることもできます。これは 1 つの特別なケースであり、他の文字が同様に影響を受けることはありません。

于 2013-06-13T09:48:09.630 に答える