2

好吧,我在 Visual Studio 2008 和 Windows 7 Professional 32 位上使用 C++ 中的 libcurl 来发送带有 UTF-8 字符的请求,但问题是我收到了那个编码错误。 �abe而不是çabe.

当我在我的本地主机服务器中进行测试时,我注意到一件事,这是我第一次在这样的 PHP 服务器中收到echo $_POST['post'];�abe,但如果我对其进行编码,它就会正确:echo utf8_encode($_POST['post']);çabe就是我想要的。

但问题是我无法控制接收数据的服务器,我想发送它已经用 UTF-8 编码。

我怎么能那样做?

这是我的帖子部分

struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
std::string post = "çabe";
url_formadd(&formpost,
      &lastptr,
      CURLFORM_COPYNAME, "post",
      CURLFORM_COPYCONTENTS, post.c_str(),
      CURLFORM_END);

@编辑

根据 DietrichEpp 的说法,要查看我是否打开了 UTF-8,我可以简单地测试示例“ç”中不同字符的长度,所以我尝试printf("%d\n", (int) strlen("ç"));了 - 它应该打印 2 或 3 用于 UTF-8,或 1 用于别的东西。

它确实打印出 1,所以这可能是原因,我该如何解决这个问题?

我想将其设置为 UTF-8 或至少能够在 cURL 的 post 字段中使用时将其设置为 utf8。

4

1 回答 1

1

如果要发送 UTF-8 编码数据,则必须将其编码为 UTF-8。例如,以 UTF-8 编码的“ç”可以方便地拼写\xC3\xA7

std::string post = "\xC3\xA7abe";

Visual Studio 2008 应该能够自动将文件保存为 UTF-8,省去您自己进行这种编码的麻烦。如果您被困在 ISO 8859-1 中,可以通过以下方式轻松实现对 UTF-8 的特定转码(优化留作练习):

std::string utf8_from_iso8859_1(std::string str)
{
  std::string res;
  for (std::string::iterator i = str.begin(); i < str.end(); i++) {
    if (0 <= *i && *i < 0x80)
      res += *i;
    else {
      res += 0xC0 | ((*i >> 6) & 0x03);
      res += 0x80 | (*i & 0x3F);
    }
  }
  return res;
}

然后使用

std::string post = "çabe";
std::string encoded = utf8_from_iso8859_1(post);
url_formadd(&formpost,
  &lastptr,
  CURLFORM_COPYNAME, "post",
  CURLFORM_COPYCONTENTS, encoded.c_str(),
  CURLFORM_END);

从其他编码转码需要特定的映射,最好的选择是使用像libiconv这样的专用库

于 2012-05-22T12:52:34.367 回答