C - Libcurl - Wie nach Mails mit Umlauten suchen



  • Hallo ich nutze Libcurl um Mails mittels IMAP Search in meinem Postfach zu suchen.
    Das funktioniert grundsätzlich alles soweit.
    Nur habe ich leider mit Umlauten Probleme:

    int main(void)
    {
      CURL *curl;
      CURLcode res = CURLE_OK;
    
      curl = curl_easy_init();
      if(curl) {
        curl_easy_setopt(curl, CURLOPT_USERNAME, "myuser");
        curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword");
    
        curl_easy_setopt(curl, CURLOPT_URL, "imaps://imap.gmail.com:993/INBOX");
    
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "SEARCH SUBJECT Spülmaschine");
    
        res = curl_easy_perform(curl);
    
        if(res != CURLE_OK)
          fprintf(stderr, "curl_easy_perform() failed: %s\n",
                  curl_easy_strerror(res));
    
        curl_easy_cleanup(curl);
      }
    
      return (int)res;
    }
    

    Rückgabewert von curl_easy_perform() ist CURLE_QUOTE_ERROR.

    Was ich schon versucht habe:

    - Charset auf UTF-8 setzen und "Spülmaschine" als UTF-8 String:

    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "SEARCH CHARSET UTF-8 SUBJECT \x53\x70\xc3\xbc\x6c\x6d\x61\x73\x63\x68\x69\x6e\x65"); //funktioniert ebenfalls nicht - CURLE_QUOTE_ERROR
    

    - UTF-7:

    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "SEARCH SUBJECT Sp+APw-lmaschine"); //liefert CURLE_OK, findet aber keine Mail in INBOX obwohl da eine liegt
    

    Als Literal senden:

    sprintf(strSearchString, "SEARCH CHARSET UTF-8 SUBJECT {%i}\r\n\x53\x70\xc3\xbc\x6c\x6d\x61\x73\x63\x68\x69\x6e\x65", strlen("\x53\x70\xc3\xbc\x6c\x6d\x61\x73\x63\x68\x69\x6e\x65"));
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, strSearchString); //liefert CURLE_URL_MALFORMAT zurück
    

    Möchte meinen Anwendern gerne die einheitliche Möglichkeit bieten, nach allerlei Keywords zu suchen.
    Ist eine Suche mittels Umlaut und libcurl vielleicht auch einfach nicht möglich ?



  • erinnerst dich an die funktion setlocale?



  • Wade1234 schrieb:

    erinnerst dich an die funktion setlocale?

    Das bringt mich aber nicht wirklich weiter:

    int main(void)
    {
      CURL *curl;
      CURLcode res = CURLE_OK;
    
      setlocale(LC_ALL, "German");
    
      curl = curl_easy_init();
      if(curl) {
        curl_easy_setopt(curl, CURLOPT_USERNAME, "myuser");
        curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword");
    
        curl_easy_setopt(curl, CURLOPT_URL, "imaps://imap.gmail.com:993/INBOX");
    
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "SEARCH SUBJECT Spülmaschine");
    
        res = curl_easy_perform(curl);
    
        if(res != CURLE_OK)
          fprintf(stderr, "curl_easy_perform() failed: %s\n",
                  curl_easy_strerror(res));
    
        curl_easy_cleanup(curl);
      }
    
      return (int)res;
    }
    

    Nach wie vor die gleichen Fehlermeldungen.



  • Th69 schrieb:

    Oder mal

    setlocale(LC_ALL, ".65001"));
    

    am Anfang des (VS) Programms aufrufen.



  • Wade1234 schrieb:

    Th69 schrieb:

    Oder mal

    setlocale(LC_ALL, ".65001"));
    

    am Anfang des (VS) Programms aufrufen.

    setlocale() liefert NULL zurück.

    MSDN:
    https://msdn.microsoft.com/en-us/library/x99tb11d.aspx

    If you provide a code page value of UTF-7 or UTF-8, setlocale will fail, returning NULL



  • hmmm kannst du libcurl auf unicode umschalten?



  • Wade1234 schrieb:

    hmmm kannst du libcurl auf unicode umschalten?

    Libcurl arbeitet standardmäßig mit ANSI.
    Paar Sachen mit UTF8/UTF7 habe ich schon ausprobiert (siehe erster Post oben), aber das funktioniert alles nicht.



  • umlaute sind da soweit ich weiß nicht genormt.

    wenn du sie trotzdem verwenden willst, müsstest du dir mal ein paar strings mit umlauten übertragen lassen und nachsehen, welchem zeichen der windows-codierung sie entsprechen und dann entsprechend umwandeln.



  • Sorry für die Falsch-Info.
    UTF-8 hat wohl auf Windows noch nie funktioniert (und wird es wohl auch nie): Who broke the UTF-8 support?

    Du kannst aber mal eine andere Codepage probieren, s. Code Page Identifiers (Windows) (z.B. 1252).



  • Th69 schrieb:

    Sorry für die Falsch-Info.
    UTF-8 hat wohl auf Windows noch nie funktioniert (und wird es wohl auch nie): Who broke the UTF-8 support?

    Du kannst aber mal eine andere Codepage probieren, s. Code Page Identifiers (Windows) (z.B. 1252).

    Das hat leider nicht funktioniert.



  • Habe mal eine kleine Debug Funktion eingebaut.

    Libcurl sendet "SEARCJ SUBJECT Sp.lmaschine", der Server antwortet "BAD Could not parse command"