2

VisualStudio2008およびWindows7Professional32ビットのC++でlibcurlを使用して、UTF-8文字を含む要求を送信していますが、問題は、そのエンコードエラーが発生することです。 �abeの代わりにçabe

ローカルホストサーバーでテストしているときに気付いたことが1つあります。これは、このような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("ç"));ました。UTF-8の場合は2または3、UTF-8の場合は1が出力されます。他の何か。

そしてそれは1を印刷しました、それが理由かもしれません、どうすればこれを修正できますか?

cURLのpostフィールドで使用する場合は、UTF-8に設定するか、少なくとも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 に答える