2016-01-02 3 views
0

Мне нужен способ преобразования символов в шестнадцатеричные значения в виде строк.UTF8 char для строки шестнадцатеричного значения

Я пробовал несколько способов, но все они просто игнорировали символы UTF8.

Например:

Примите характер:

Ş

Если его конвертируется правильно, его шестнадцатеричное значение 0x15E но этот код просто возвращает мне 0x3F, который только характер ?.

wchar_t mychar = 'Ş'; 
cout << hex << setw(2) << setfill('0') 
        << static_cast<unsigned int>(mychar); 

Я нашел яваскрипта функцию, которая именно то, что мне нужно, но не может преобразовать его в C++ Here

Благодаря

+1

Какой тип 'mychar'? –

+0

@ πάνταῥεῖ uhm позволяет сказать 'Ş' –

+1

С каких это 'Ş' типа ?? –

ответ

1

Проблема заключается в том, что вы присваиваете char литерала wchar_t mychar. Поскольку char имеет только один байт, он не может хранить символ Ş. Вы должны префикс литерала L, как это:

wchar_t mychar = L'Ş'; 

Очень хорошая статья о Unicode, кодировок и т.д. является The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) Джоэл Спольски.

+0

Спасибо! Indeec - отличная статья. Получил это теперь, теперь спасибо. –

+0

Обратите внимание, что 'mychar' будет закодирован как UTF16 или UTF32, в зависимости от компилятора и платформы. В UTF8 код Unicode U + 015E равен '0xC5 0x9E'. Существует много способов преобразования 'wchar_t' в UTF8 либо во время компиляции, либо во время выполнения, в зависимости от используемого компилятора и библиотек. –

0

Даже если вы префикс их 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 лучше подходят для обработки символов Unicode.