Как напечатать Unicode символов в шестнадцатеричных кодах в C ++ - PullRequest
0 голосов
/ 30 июля 2009

Я читаю строку данных из базы данных оракула, которая может содержать или не содержать символы Unicode, в программу на c ++. Есть ли способ проверить, извлекается ли строка из базы данных символов Unicode (UTF-8). если присутствуют какие-либо символы Юникода, они должны быть преобразованы в шестнадцатеричный формат и должны отображаться.

Ответы [ 2 ]

1 голос
/ 30 июля 2009

У этого вопроса есть два аспекта.

  1. Различают символы в кодировке UTF-8 от обычных символов ASCII.

    UTF-8 кодирует любую кодовую точку выше 127 как последовательность из двух или более байтов. Значения 127 и ниже остаются нетронутыми. Результирующие байты из кодировки также превышают 127, поэтому достаточно проверить старший бит байта, чтобы увидеть, соответствует ли он.

  2. Отображение закодированных символов в шестнадцатеричном формате.

    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.

0 голосов
/ 30 июля 2009

Я бы преобразовал строку в UTF-32 (для этого можно использовать что-то вроде UTF CPP - это очень просто), а затем перебрал бы полученную строку, обнаружив кодовые точки (символы), которые выше 0x7F и выведите их в шестнадцатеричном виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...