2010-08-28 10 views
7

Necesito una biblioteca que pueda URLencode una matriz de cadena/char.C++ URLencode library (Capacidad Unicode)?

Ahora, puede codificar una matriz hexagonal ASCII como aquí: http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4029

pero necesito algo que funciona con Unicode. Nota: En Linux ¡Y en Windows!

CURL tiene una muy agradable:

char *encodedURL = curl_easy_escape(handle,WEBPAGE_URL, strlen(WEBPAGE_URL)); 

pero en primer lugar, que necesita CURL y tampoco es capaz de Unicode, como se ve por strlen

Respuesta

8

Si leo la búsqueda correctamente y que desea hacerlo usted mismo, sin necesidad de utilizar rizo creo que tengo una solución (sssuming UTF-8) y yo pensar esta es una manera conformes y portátil de cadenas de consulta de codificación de URL :

#include <boost/function_output_iterator.hpp> 
#include <boost/bind.hpp> 
#include <algorithm> 
#include <sstream> 
#include <iostream> 
#include <iterator> 
#include <iomanip> 

namespace { 
    std::string encimpl(std::string::value_type v) { 
    if (isalnum(v)) 
     return std::string()+v; 

    std::ostringstream enc; 
    enc << '%' << std::setw(2) << std::setfill('0') << std::hex << std::uppercase << int(static_cast<unsigned char>(v)); 
    return enc.str(); 
    } 
} 

std::string urlencode(const std::string& url) { 
    // Find the start of the query string 
    const std::string::const_iterator start = std::find(url.begin(), url.end(), '?'); 

    // If there isn't one there's nothing to do! 
    if (start == url.end()) 
    return url; 

    // store the modified query string 
    std::string qstr; 

    std::transform(start+1, url.end(), 
       // Append the transform result to qstr 
       boost::make_function_output_iterator(boost::bind(static_cast<std::string& (std::string::*)(const std::string&)>(&std::string::append),&qstr,_1)), 
       encimpl); 
    return std::string(url.begin(), start+1) + qstr; 
} 

no tiene dependencias no estándar que no sean impulso y si no te gusta el impulso de dependencia que no es tan difícil de eliminar.

he comprobado usando:

int main() { 
    const char *testurls[] = {"http://foo.com/bar?abc<>de??90 210fg!\"$%", 
           "http://google.com", 
           "http://www.unicode.com/example?großpösna"}; 
    std::copy(testurls, &testurls[sizeof(testurls)/sizeof(*testurls)], 
       std::ostream_iterator<std::string>(std::cout,"\n")); 
    std::cout << "encode as: " << std::endl; 
    std::transform(testurls, &testurls[sizeof(testurls)/sizeof(*testurls)], 
        std::ostream_iterator<std::string>(std::cout,"\n"), 
        std::ptr_fun(urlencode)); 
} 

Qué todo parecía funcionar:

http://foo.com/bar?abc<>de??90 210fg!"$% 
http://google.com 
http://www.unicode.com/example?großpösna 

se convierte en:

http://foo.com/bar?abc%3C%3Ede%3F%3F90%20%20%20210fg%21%22%24%25 
http://google.com 
http://www.unicode.com/example?gro%C3%9Fp%C3%B6sna 

Qué cuadrados con estas examples

3

Se puede considerar la conversión de su URL Unicode UTF8 primera , los datos UTF8 llevarán sus datos Unicode en caracteres ASCII. Una vez que obtenga su URL en UTF8, podrá codificar fácilmente la URL con la API que prefiera.

+0

no es UTF8 Unicode? – maxschlepzig

+0

UTF-8 es uno de los protocolos de cable para transferir datos Unicode. Tiene la ventaja adicional de ser compatible con la codificación ASCII. +1 por sugerencia de GJ. – ivymike

+0

@maxschlepzig: yo también lo pensé. Pero aprendí algo nuevo hoy ... –