LINUX.ORG.RU

Как c помощью libcurl отправить POST строку в юникоде.

 ,


0

1

В примере ниже curl_easy_perform(curl) отправляет строку символов типа char «moo mooo moo moo». А мне нужно не только латиницу отправлять. Как сделать?

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
 
int main(void)
{
  CURL *curl;
  CURLcode res;
 
  static const char *postthis="moo mooo moo moo";
 
  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
 
    /* if we don't provide POSTFIELDSIZE, libcurl will strlen() by
       itself */ 
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));
 
    /* Perform the request, res will get the return code */ 
    res = curl_easy_perform(curl);
    /* Check for errors */ 
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
 
    /* always cleanup */ 
    curl_easy_cleanup(curl);
  }
  return 0;
}

А в чём проблема? Ну поменяй байты на %D1 и т.п.

emulek
()

Проблема в том, что sizeof(char)=1. А мне нужно вместо строки char *postthis=«moo mooo moo moo» передать на сайт строку uint16_t *postthis=«му му му му».
Ну а curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis) требует, чтобы postthis был именно *char. Вот в чем дело.

podovalov5
() автор топика
Ответ на: комментарий от four_str_sam

А что мешает скастовать к char* ?

Там куда я посылаю, требуется, чтобы символы были в юникоде. Разве можно поместить юникодовский символ в char?

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

там куда я посылаю, требуется, чтобы символы были в юникоде.

Твоя юникод-строка просто набор байт. А вот как трактовать этот набор байт дело сервера, а не курла, который должен просто эти байты переслать.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от Vovka-Korovka

Перефразирую:
Есть у меня массив uint16_t* post_data. Каждый элемент этого массива - это символ в юникоде. Как мне этот массив привести к типу char* без потерь, чтобы курлом отослать.

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

Перевод указателя с одного типа к другому не влияет на данные, на которые этот указатель и указывает.
Может возникнуть проблема, если твой курл не принимает длинну строки и читает ее до нуля. Ибо в utf16 могут быть нули.

Cactus64k
()
Ответ на: комментарий от podovalov5

Там куда я посылаю, требуется, чтобы символы были в юникоде.

В Юникоде есть семь схем кодирования — UTF-8, UTF-16BE, UTF-16LE, UTF-16 с BOM/автоопределением порядка байт, UTF-32BE, UTF-32LE и UTF-32 с BOM/автоопределением порядка байт. Тебе какую надо? UTF-8?

Есть у меня массив uint16_t* post_data. Каждый элемент этого массива - это символ в юникоде.

Если привести этот указатель к char*, получится указатель на строку в UTF-16 с нативным порядком байт (на x86 будет little endian). Если тебе это и надо, то так и передавай.

/* if we don't provide POSTFIELDSIZE, libcurl will strlen() by
itself */
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));

Вот только strlen на строках в UTF-16 делать нельзя, там могут быть нулевые байты в середине строки.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.