22

wstring と string の間で変換する必要があります。codecvt ファセットを使用するとうまくいくはずですが、utf-8 ロケールではうまくいかないようです。

私の考えは、utf-8でエンコードされたファイルをcharに読み取ると、1つのutf-8文字が2つの通常の文字に読み取られるということです(これがutf-8の仕組みです)。コードで使用するライブラリの wstring 表現からこの utf-8 文字列を作成したいと思います。

誰もそれを行う方法を知っていますか?

私はすでにこれを試しました:

  locale mylocale("cs_CZ.utf-8");
  mbstate_t mystate;

  wstring mywstring = L"čřžýáí";

  const codecvt<wchar_t,char,mbstate_t>& myfacet =
    use_facet<codecvt<wchar_t,char,mbstate_t> >(mylocale);

  codecvt<wchar_t,char,mbstate_t>::result myresult;  

  size_t length = mywstring.length();
  char* pstr= new char [length+1];

  const wchar_t* pwc;
  char* pc;

  // translate characters:
  myresult = myfacet.out (mystate,
      mywstring.c_str(), mywstring.c_str()+length+1, pwc,
      pstr, pstr+length+1, pc);

  if ( myresult == codecvt<wchar_t,char,mbstate_t>::ok )
   cout << "Translation successful: " << pstr << endl;
  else cout << "failed" << endl;
  return 0;

cs_CZ.utf-8 ロケールでは「失敗」を返し、cs_CZ.iso8859-2 ロケールでは正しく機能します。

4

6 に答える 6

88

以下のコードはあなたを助けるかもしれません:)

#include <codecvt>
#include <string>

// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.from_bytes(str);
}

// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.to_bytes(str);
}
于 2012-10-15T21:00:03.947 に答える
6

あなたのプラットフォームは何ですか?WindowsはUTF-8ロケールをサポートしていないため、失敗する理由が説明される場合があることに注意してください。

プラットフォームに依存する方法でこれを行うには、WindowsではMultiByteToWideChar / WideCharToMultiByteを使用し、Linuxではiconvを使用します。プラットフォームに依存しない方法でこれを行うためにいくつかのブースト魔法を使用できるかもしれませんが、私はそれを自分で試したことがないので、このオプションについて追加することはできません。

于 2010-12-05T17:51:56.197 に答える
-1

ロケールが行うことは、外部エンコーディングに関するプログラム情報を提供することですが、内部エンコーディングは変更されていないと想定しています。wchar_tUTF-8を出力する場合は、からではなくから出力する必要がありますchar*

できることは、生データ(文字列ではない)として出力することです。システムロケールがUTF-8の場合は、正しく解釈されるはずです。

さらに、//を使用する場合(w)coutは、ストリームにロケールを吹き込む必要があります(w)cerr(w)cin

于 2010-12-05T13:23:48.523 に答える
-2

Lexertl ライブラリには、これを可能にするイテレータがあります。

std::string str;
str.assign(
  lexertl::basic_utf8_out_iterator<std::wstring::const_iterator>(wstr.begin()),
  lexertl::basic_utf8_out_iterator<std::wstring::const_iterator>(wstr.end()));
于 2012-07-26T22:54:56.450 に答える
-10

C++ には Unicode の概念がありません。UnicodeStringICU ( class ) や Qt ( QStringclass )などの外部ライブラリを使用します。どちらも UTF-8 を含む Unicode をサポートしています。

于 2010-12-05T13:34:23.247 に答える