如何在embarcadero c ++中将Unicode字符串转换为char*
或char* const
?
答案 0 :(得分:4)
String text = "Hello world";
char *txt = AnsiString(text).c_str();
Older text.t_str() is now AnsiString(String).c_str()
答案 1 :(得分:2)
“Unicode字符串”确实不够具体,无法知道您的源数据是什么,但您可能意味着'UTF-16字符串存储为wchar_t数组',因为大多数人都不知道正确的术语使用。
“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字符串是UTF-16,就像Windows上的情况一样,但是否则是可移植代码。
答案 2 :(得分: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数据的各个字节。
(这当然与转换文本的编码无关。为此,请使用像iconv
或ICU这样的库。)
答案 3 :(得分: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中不可用。