2009-05-29 5 views

Antwort

7
+0

Schnell Lösung, schön. Ich wollte Quellcode posten, aber das wird nur fin! – toto

+0

Ein CString wird nicht direkt übernommen oder zurückgegeben, aber es ist einfach, hin und her zu konvertieren. –

+0

Hinweis - Funktion kann auch dekodieren, aber lesen Sie die Bemerkungen sorgfältig. – Spike0xff

0

Ich habe eine Wrapper-Funktion für andere, die über diese Lösung kommen können. Auch erfordert wininet.lib Verknüpfung und einschließlich 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; 
    } 

Nutzungs

CString internetUse = "The Internet is %%4 <pr0n>"; 

    EscapeURL (internetUse); 

    // internetUse = 0x01538890 "The%20Internet%20is%20%25%254%20%3Cpr0n%3E" 
+0

Sie verlieren Speicher. EscapedString wird kopiert, aber nie gelöscht. – TheSteve

Verwandte Themen