Мне нужен способ конвертировать символы в шестнадцатеричные значения в виде строк.
Я пробовал несколько способов, но все они просто игнорировали символы UTF8.
Например:
Взять характер:
Ş
Если он преобразован правильно, его шестнадцатеричное значение 0x15E
но этот код просто возвращает меня 0x3F
который просто персонаж ?
,
wchar_t mychar = 'Ş';
cout << hex << setw(2) << setfill('0')
<< static_cast<unsigned int>(mychar);
Я нашел функцию JavaScript, которая именно то, что мне нужно, но не смог преобразовать ее в C ++ Вот
Спасибо
Проблема в том, что вы назначаете char
буквально wchar_t mychar
, Поскольку char имеет длину только один байт, он не может хранить символ Ş
, Вы должны префикс литерала с L
, как это:
wchar_t mychar = L'Ş';
Очень хорошая статья о Unicode, кодировках и т. Д. Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!) Джоэл Спольски.
Даже если вы добавите к ним префикс L, тип wchar_t не очень хорошо обрабатывает международные наборы символов.
Попробуй это:
char16_t mychar16 {u'Ş'}; // Initialized with UTF-16 code
char32_t mychar32 {U'Ş'}; // Initialized with UTF-32 code
cout << showbase << hex << setw(12) << setfill('0')
<< std::setiosflags(ios::left | ios::hex)
<< static_cast<unsigned int>(mychar16) << endl;
Результат:
0x15e0000000
Кодировка символов, которая применяется с типом wchar_t определяется реализацией, поэтому она может варьироваться от одного компилятора к другому.
Типы char16_t и char32_t лучше подходят для обработки символов Юникода.