【问题标题】:URL escaping MFC stringsURL 转义 MFC 字符串
【发布时间】:2010-10-29 18:56:53
【问题描述】:

如何对 MFC CString 进行 URL 转义?

【问题讨论】:

    标签: c++ mfc urlencode cstring


    【解决方案1】:

    【讨论】:

    • 快速解决方案,不错。我本来打算发布源代码,但这样就可以了!
    • 不直接取也不返回一个CString,但是来回转换很简单。
    • 这个函数把我的变音符号弄乱了。
    【解决方案2】:

    我为可能遇到此解决方案的其他人创建了一个包装函数。还需要链接到 Wininet.lib 并包括 wininet.h

        bool EscapeURL ( CString& url, DWORD options = ICU_DECODE | ICU_ENCODE_PERCENT )
        {
            DWORD bytes = url.GetLength () + 1;
            LPTSTR escapedString = new TCHAR[bytes + 1];
            escapedString[0] = 0;
    
            // First read will generate the correct byte count for the return string 
            //
            bool result = InternetCanonicalizeUrl ( url.GetBuffer (), escapedString, &bytes, options );
            if ( !result )
            {
                // Resize the String
                //
                delete [] escapedString;
                escapedString = new TCHAR[bytes];
                escapedString[0] = 0;
    
                result = InternetCanonicalizeUrl ( url.GetBuffer (), escapedString, &bytes, options );
            }
    
            if ( result )
            {
                url = escapedString;
                delete [] escapedString; // Thanks The Steve
            }
            else
            {
                // Optional
                // If the call fails return the message in the url
                //
                DWORD errorMessageID = ::GetLastError ();
                LPSTR messageBuffer = nullptr;
                size_t size = FormatMessageA ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                                         NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
    
                std::string message ( messageBuffer, size );
    
                LocalFree ( messageBuffer );
    
                url = message.c_str ();
            }
    
            return result;
        }
    

    用法

        CString internetUse = "The Internet is %%4 <pr0n>";
    
        EscapeURL ( internetUse );
    
        // internetUse = 0x01538890 "The%20Internet%20is%20%25%254%20%3Cpr0n%3E"
    

    【讨论】:

    • 您正在泄漏内存。 escapedString 被复制,但永远不会被删除。
    • 发生错误时您正在泄漏内存。 delete[] escapedString 应该在返回之前移动。此外,您正在使用缓冲区而不测试它们。在重新分配 escapedString 之前,请检查 bytes 是否 > 0
    猜你喜欢
    • 2011-07-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2016-04-15
    相关资源
    最近更新 更多