将unicode转换为char

时间:2012-06-14 20:14:43

标签: c++ unicode char locale c++builder

如何在embarcadero c ++中将Unicode字符串转换为char*char* const

4 个答案:

答案 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中不可用。