6

現在、既存のライブラリの単なるラッパーであるプラグインを作成しています。プラグインのホストは、次のように定義された utf-16 形式の文字列を渡します。

typedef unsigned short PA_Unichar;

そして、ラップされたライブラリは const char* または std::string utf-8 形式の文字列のみを受け入れます

std::string toUtf8(const PA_Unichar* data)
{
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
return std::string(convert.to_bytes(static_cast<const char16_t*>(data));
}

しかし、明らかにこれは機能せず、「「const ポインター」(別名「const unsigned short*」) から「const char16_t *」への static_cast は許可されていません」というコンパイル エラーがスローされます。

では、最もエレガントで正しい方法は何ですか?

前もって感謝します。

4

1 に答える 1

2

コンストラクターを使用しPA_unicharて文字列を文字列に変換し、試みたようにファセットを使用できます。char16_tbasic_string(Iterator, Iterator)std::codecvt_utf8_utf16

std::string conv(const PA_unichar* str, size_t len)
{
  std::u16string s(str, str+len);
  std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
  return convert.to_bytes(s);
}

その通りだと思います。残念ながら、私の実装ではまだサポートされていないため、これをテストすることはできません。GCC 4.9 に含める予定の実装がありますが、それをテストするためwstring_convertの実装がありません。codecvt_utf8_utf16

于 2012-12-15T21:07:52.467 に答える