Вопрос по unicode, locale, char, c++, c++builder – конвертировать юникод в символ

1

Как я могу преобразовать строку Unicode вchar* или жеchar* const впричал с ++?

От Unicode до какой локали? Или если на windows какая кодовая страница? Что именно ты пытаешься сделать? RedX
Эмбаркадеро кажетсяremarkably well documented jxh
Я извиняюсь, но вы явно не искали документацию, я нашелthe exact page that addresses this issue менее чем за 60 секунд. Как уже говорилось, Embarcadero делает безупречную работу по предоставлению надежной документации с соответствующими примерами. b1nary.atr0phy

Ваш Ответ

4   ответа
1

на символы. Так что, если ваши данные 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 один за другим.

(Это, конечно, не имеет ничего общего сconverting the encoding вашего текста. Для этого используйте библиотеку вродеiconv или ICU.)

Поскольку ОП специально просили преобразовать, это не кажется очень полезным ответом.
2

& quot; Unicode string & quot; на самом деле не достаточно конкретен, чтобы знать, каковы ваши исходные данные, но вы, вероятно, имеете в виду «строку UTF-16, сохраненную как массив wchar_t»; так как это то, что большинство людей, которые не знают правильной терминологии, используют.

& Quot; символ * & Quot; также недостаточно того, чтобы знать, на что вы хотите нацелиться, хотя, возможно, и «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, но в остальном это переносимый код.

Embarcadero действительно имеет «некоторое соглашение» как вы выразились. Цитата из документов:'Delphi also supports UnicodeString, but implements it as a primitive type rather than a class. By default, variables declared as type String are UnicodeString.' Также важно отметить:'Despite its name, UnicodeString can represent both Unicode strings and ANSI strings, ANSI strings being converted first.'
«строка ANSI»; все еще недостаточно, даже если мы игнорируем тот факт, что Американский национальный институт стандартов никогда не определял такую вещь, и признаем, что они имеют в виду то, что Microsoft называет этим именем; Microsoft определяет множество «кодовых страниц» который может использоваться с так называемым «ANSI»; строки.
4
String text = "Hello world";
char *txt = AnsiString(text).c_str();

Older text.t_str() is now AnsiString(String).c_str()
Это правильный ответ, прямо из документации Embarcadero.
Обратите внимание, что вы можете указать кодовую страницу для AnsiString:docwiki.embarcadero.com/RADStudio/Seattle/en/… Однако вы правы в том, что преобразование из Unicode в ANSI может (и часто будет) с потерями.
Это не сможет обработать любые символы за пределами используемой локали, и поскольку в Windows нет локали, поддерживающей все символы (например, локаль UTF-8 будет поддерживать все символы)AnsiString просто не может обеспечить преобразование без потерь для всех входных данных в Windows.
0

//#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.

Похожие вопросы