У этого вопроса есть два аспекта.
Различают символы в кодировке UTF-8 от обычных символов ASCII.
UTF-8 кодирует любую кодовую точку выше 127 как последовательность из двух или более байтов. Значения 127 и ниже остаются нетронутыми. Результирующие байты из кодировки также превышают 127, поэтому достаточно проверить старший бит байта, чтобы увидеть, соответствует ли он.
Отображение закодированных символов в шестнадцатеричном формате.
C ++ имеет std::hex
, чтобы указать потокам форматировать числовые значения в шестнадцатеричном формате Вы можете использовать std::showbase
, чтобы сделать вывод красивым. A char
не считается числовым; Потоки будут просто печатать символ. Вы должны будете принудительно ввести значение в другой числовой тип, такой как int
. Остерегайтесь расширения знака, хотя.
Вот код для демонстрации:
#include <iostream>
void print_characters(char const* s)
{
std::cout << std::showbase << std::hex;
for (char const* pc = s; *pc; ++pc) {
if (*pc & 0x80)
std::cout << (*pc & 0xff);
else
std::cout << *pc;
std::cout << ' ';
}
std::cout << std::endl;
}
Вы можете назвать это так:
int main()
{
char const* test = "ab\xef\xbb\xbfhu";
print_characters(test);
return 0;
}
Вывод на Solaris 10 с Sun C ++ 5.8:
$ ./a.out
a b 0xef 0xbb 0xbf h u
Код обнаруживает символы в кодировке UTF-8, но не прилагает усилий для их декодирования; ты не упомянул о необходимости сделать это.
Я использовал *pc & 0xff
, чтобы преобразовать выражение в целочисленный тип и замаскировать биты с расширенными знаками. Без этого вывод на моем компьютере был, например, 0xffffffbb
.