将unicode转换为char

问题描述 投票:0回答:4

如何在

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

c++ unicode char locale c++builder
4个回答
4
投票
String text = "Hello world";
char *txt = AnsiString(text).c_str();

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 字符串是 UTF-16,就像 Windows 上的情况一样,但除此之外是可移植代码。


1
投票

您可以合法地将任何数组重新解释为 char 指针数组。因此,如果您的 Unicode 数据采用 4 字节代码单元,例如

char32_t data[100];

然后您可以将其作为字符数组访问:

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这样的库。)


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

© www.soinside.com 2019 - 2024. All rights reserved.