2014-01-19 1 views
0

C++에서 URI를 디코딩해야합니다. 그것에 대해 몇 가지 질문을했지만, 모두 UTF-8 인코딩 및 액센트를 처리하지 못했습니다 (ASCII 문자를 정확하게 처리하는 데 관심이 있습니다).C++에서 UTF-8 문자로 URI를 디코딩하는 방법

그런 다음 libcurl ...과 같이 널리 사용되는 라이브러리를 사용했지만 UTF-8 인코딩도 처리하지 못했습니다. 저는 여기에 문제는이 aáeéiíoóuú을해야 할 때 a%C3%A1e%C3%A9i%C3%ADo%C3%B3u%C3%BAaáeéiíoóuú로 디코딩됩니다 있다는 것입니다

string UriHelper::Decode(const string &encoded) 
{ 
    CURL *curl = curl_easy_init(); 
    int outlength; 
    char *cres = curl_easy_unescape(curl, encoded.c_str(), encoded.length(), &outlength); 
    string res(cres, cres + outlength); 
    curl_free(cres); 
    curl_easy_cleanup(curl); 
    return res; 
} 

을하고있어거야. a%E1e%E9i%EDo%F3u%FA을 사용하면 잘 작동합니다.

인코딩 된 URI를 다르게 처리하고 처리 할 수있는 라이브러리가 있습니까?

감사합니다.

답변

2

디코딩에 아무런 문제가 없습니다. 디코딩 된 URL의 인쇄가 문제입니다. 인쇄 할 출력 장치는 UTF-8이 아닌 ISO-8859-1로 인코딩 된 문자열을 허용하도록 구성됩니다.

UTF-8로 인코딩 된 문자열을 허용하도록 출력 장치를 구성하거나 디코딩 된 URL을 UTF-8에서 ISO-8859-1로 변환하십시오.

1

오스왈드 (Oswald)가 말했듯이, 문제는 디코딩과 관련이 없습니다 ...하지만 문자열을 표시하는 데 사용하는 방법을 사용합니다. UTF-8 문자열을 처리 할 필요가 없으므로 두 번째 제안을 ISO-8859-1로 변환 할 것입니다.

이 작업을 수행하기 위해 아이디어를 차용 (그리고 대부분의 코드)이 대답 Is there a way to convert from UTF8 to iso-8859-1?

에서, 나는 iconv와 종속성을 추가했습니다.

은 여기 내 UriHelper.h

#pragma once 

using namespace std; 

static class UriHelper 
{ 
public: 
    static string Encode(const string &source); 
    static string Decode(const string &encoded); 
}; 

입니다 그리고 이것은 내 UriHelper.cpp입니다

#include "UriHelper.h" 
#include <curl/curl.h> 
#include <iconv.h> 

string UriHelper::Encode(const string &source) 
{ 
    CURL *curl = curl_easy_init(); 
    char *cres = curl_easy_escape(curl, source.c_str(), source.length()); 
    string res(cres); 
    curl_free(cres); 
    curl_easy_cleanup(curl); 
    return res; 
} 

string UriHelper::Decode(const string &encoded) 
{ 
    CURL *curl = curl_easy_init(); 
    int outlength; 
    char *cres = curl_easy_unescape(curl, encoded.c_str(), encoded.length(), &outlength); 
    string res(cres, cres + outlength); 
    curl_free(cres); 
    curl_easy_cleanup(curl); 

    //if it's UTF-8, convert it to ISO_8859-1. Based on https://stackoverflow.com/questions/11156473/is-there-a-way-to-convert-from-utf8-to-iso-8859-1/11156490#11156490 
    iconv_t cd = iconv_open("ISO_8859-1", "UTF-8"); 

    const char *in_buf = res.c_str(); 
    size_t in_left = res.length(); 

    char *output = new char[res.length() + 1]; 
    std::fill(output, output + res.length() + 1, '\0'); 
    char *out_buf = &output[0]; 
    size_t out_left = res.length(); 

    do { 
     if (iconv(cd, &in_buf, &in_left, &out_buf, &out_left) == (size_t)-1) { 
      //failed to convert, just return the value received from curl 
      delete[] output; 
      iconv_close(cd); 
      return res; 
     } 
    } while (in_left > 0 && out_left > 0); 

    string outputString(output); 
    delete[] output; 
    iconv_close(cd); 

    return outputString; 
} 
+0

빠른 참고 : 코드는 예외 안전하지 않으며 MT-안전 –