1

Unicode 文字列をembarcadero c++のchar*またはchar* constに変換するにはどうすればよいですか?

4

4 に答える 4

4
String text = "Hello world";
char *txt = AnsiString(text).c_str();

Older text.t_str() is now AnsiString(String).c_str()
于 2012-10-19T05:54:36.450 に答える
2

「Unicode文字列」は、ソースデータが何であるかを知るのに十分具体的ではありませんが、正しい用語を知らないほとんどの人が使用しているため、おそらく「wchar_t配列として保存されたUTF-16文字列」を意味します.

「char*」だけでは、何をターゲットにしたいのかを知るには不十分ですが、「embarcadero」にはいくつかの規則があるかもしれません。特に言及しない限り、UTF-8 データが必要であると仮定します。

また、私の例は VS2010 で動作するものに限定します

// your "Unicode" string
wchar_t const * utf16_string = L"Hello, World!";

// #include <codecvt>
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;

std::string utf8_string = convert.to_bytes(utf16_string);

これは、wchar_t 文字列が Windows の場合と同様に UTF-16 であることを前提としていますが、それ以外は移植可能なコードです。

于 2012-06-14T20:36:47.613 に答える
1

任意の配列を char ポインターの配列として合法的に再解釈できます。したがって、Unicode データが次のような 4 バイト コード単位である場合

char32_t data[100];

次に、char 配列としてアクセスできます。

char const * p = reinterpret_cast<char const*>(data);

for (std::size_t i = 0; i != sizeof data; ++i)
{
    std::printf("Byte %03zu is 0x%02X.\n", i, p[i]);
}

そうすれば、Unicode データの個々のバイトを 1 つずつ調べることができます。

(もちろん、これはテキストのエンコーディングの変換とは関係ありません。そのためには、iconvまたは ICU のようなライブラリを使用してください。)

于 2012-06-14T20:17:53.583 に答える
0

Windows を使用している場合:

//#include <windows.h>
u16string utext = u"объява";
char text[0x100];
WideCharToMultiByte(CP_UTF8,NULL,(const wchar_t*)(utext.c_str()),-1,text,-1,NULL,NULL);
cout << text;

std::wstring_convert を使用できないため、MinGW 4.9.2 では使用できません。

于 2015-11-02T20:54:55.770 に答える