代码之家  ›  专栏  ›  技术社区  ›  kolrie

C++、JsonCpp、LIGURL和UTF-8困境

  •  1
  • kolrie  · 技术社区  · 14 年前

    我在用C++ JSONCPP库进行LIBCURL工作时遇到了一些问题,经过大量的研究,我提出了这个代码:

    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'
    

    什么是最好的方式采取C++ SCTRIN(在这种情况下数据),并安全地转换它UTF-8,然后到 *char 可以很好地使用libcurl的变量?

    1 回复  |  直到 14 年前
        1
  •  1
  •   kolrie    14 年前

    我发现了问题。它不在代码的那部分。我实际上是在做一个导致问题的字符串分裂。

    推荐文章