C ++, JsonCpp, libcurl и UTF-8 горе - PullRequest
       9

C ++, JsonCpp, libcurl и UTF-8 горе

1 голос
/ 15 сентября 2010

У меня были некоторые проблемы с тем, чтобы libcurl работал с библиотекой C ++ JsonCpp, и после долгих исследований я придумал следующий код:

int post(const string& call, const string& key, const string& value) {
  // (...)

  char* char_data=NULL; 
  struct curl_slist *headers=NULL;

  headers = curl_slist_append(headers, "Content-Type: application/json; charset=UTF-8");

  Json::Value root;
  root[key] = value;

  Json::StyledWriter writer;
  string data = writer.write(root);

  char_data = (char*) malloc((strlen(data.c_str())+1) * sizeof(char));
  strcpy(char_data, data.c_str());

  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, char_data);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(char_data));

  // (...)
}

Это прекрасно работает, пока data (C ++ std::string, который содержит строковое представление JSON) не имеет никаких символов, отличных от ascii. Когда это происходит, я получаю сообщение об ошибке от бэкэнда (написано в Rails 3):

Started POST "/deployments/4c904f607d7c4249cf00002c/log.json" for 67.23.79.89 at Wed Sep 15 00:45:40 -0400 2010
  Processing by DeploymentsController#log as JSON
  Parameters: {"log"=>"0 upgraded, 0 newly \214\211K########talled, 0 to remove and 46 not upgraded.\n", "id"=>"4c904f607d7c4249cf00002c"}
Completed   in 6ms

BSON::InvalidStringEncoding (String not valid UTF-8):
  app/models/deployment.rb:161:in `log'
  app/models/deployment.rb:160:in `each'
  app/models/deployment.rb:160:in `log'
  app/controllers/deployments_controller.rb:54:in `log'

Каков наилучший способ взять sctring C ++ (в данном случае данные) и безопасно преобразовать его в UTF-8, а затем в переменную *char, которая будет хорошо работать с libcurl?

1 Ответ

1 голос
/ 17 сентября 2010

Я нашел проблему. Это не было в той части кода. Я на самом деле делала строку, которая вызывала проблему.

...