2

基本的に、私は大まかにこのような関数を持っており、戻る必要があります。

const char* UTF16ToUTF8(const wchar_t *in) {
    int tmp = wcslen(in);
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &in[0], (size_t)tmp, NULL, 0, NULL, NULL);
    std::vector<char> out;
    out.resize(size_needed);
    WideCharToMultiByte(CP_UTF8, 0,  &in[0], (size_t)tmp, &out[0], size_needed, NULL, NULL);

    return &out[0];
}

明らかに、戻るときに out が逆参照されます。私のオプションは何ですか?この関数をそのように呼び出すことができる必要があります。私は絶対にスタックにとどまりたいです。

utf8outputfile << UTF16ToUTF8(wchar_tString) << endl;
fprintf(utf8outputfile, "%s", UTF16ToUTF8(L"Mmm Mmm Unicode String κόσμε"));
return UTF16ToUTF8(wchar_tString);
4

2 に答える 2

6

そのような心配をせずに、次のように返信してstd::stringください。

std::string UTF16ToUTF8(const wchar_t *in) {
  std::vector<char> out;
  //...
  return std::string(out.begin(), out.end());  // or std::string(out.data())
}

次に、C インターフェイスで次を使用します。

printf("%s", UTF16ToUTF8(ws).c_str());

関数の引数を作成しstd::wstring、API 関数を呼び出すときにのみ C 文字列を抽出します。

begin/endバージョンにはすべての文字が含まれ、バージョン.data()はバッファを null で終わる文字列として扱います。最も適切なものを選択してください。

于 2011-09-05T02:18:39.697 に答える
2

std::string を返すことが私の最初の選択肢です。

ただし、確実に char* が必要な場合は、いくつかのオプションがあります。

ヒープに新しい char* を割り当てて、それを返すことができます。呼び出し元が常にメモリの割り当てを解除するように本当に注意してください。この所有権の譲渡を明示する、配列に適したブースト auto_ptr に相当するものがあると思います。

別のオプションは、呼び出し元が char* (および最大サイズ) を渡し、関数がそこにデータを入れることです。したがって、呼び出し元は常にメモリを所有します。

もう 1 つのオプションは、呼び出し元が char** (または char*&) を渡して、関数が呼び出し元のポインターにメモリを割り当てることです。これにより、所有権の移転が明確になります。(呼び出し元が必要とする可能性がある場合は、サイズを保持するサイズ (size_t&) パラメーターを使用することもできます)。

于 2011-09-05T05:26:12.563 に答える