Unicode 文字列をembarcadero c++のchar*
またはchar* const
に変換するにはどうすればよいですか?
4 に答える
String text = "Hello world";
char *txt = AnsiString(text).c_str();
Older text.t_str() is now AnsiString(String).c_str()
「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 であることを前提としていますが、それ以外は移植可能なコードです。
任意の配列を 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 のようなライブラリを使用してください。)
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 では使用できません。