Как сопоставить символы Юникода с boost::spirit?

Как я могу сопоставить символы Юникода utf8, используя boost::spirit?

Например, я хочу распознать все символы в этой строке:

$ echo "На берегу пустынных волн" | ./a.out
Н а б е р е гу п у с т ы н н ы х в о л н

Когда я пробую эту простую программу boost::spirit, она не будет правильно сопоставлять символы Юникода:

#include 
#include 
#include 
namespace qi = boost::spirit::qi;

int main() {
  std::cin.unsetf(std::ios::skipws);
  boost::spirit::istream_iterator begin(std::cin);
  boost::spirit::istream_iterator end;

  std::vector letters;
  bool result = qi::phrase_parse(
      begin, end,  // input     
      +qi::char_,  // match every character
      qi::space,   // skip whitespace 
      letters);    // result    

  BOOST_FOREACH(char letter, letters) {
    std::cout << letter << " ";
  }
  std::cout << std::endl;
}

Она ведет себя как this:

$ echo "На берегу пустынных волн" | ./a.out | less
 <9D>        <80>      <83>    <83>  <81>  <82>  <8B>      <8B>  <85>  
       

UPDATE:

Хорошо, я немного поработал над этим, и следующий код вроде как работает. Сначала он преобразует ввод в итератор 32-битных символов Юникода (как рекомендуется здесь):

#include 
#include 
#include 
#include 
namespace qi = boost::spirit::qi;

int main() {
  std::string str = "На берегу пустынных волн";
  boost::u8_to_u32_iterator
      begin(str.begin()), end(str.end());
  typedef boost::uint32_t uchar; // a unicode code point
  std::vector letters;
  bool result = qi::phrase_parse(
      begin, end,             // input
      +qi::standard_wide::char_,  // match every character
      qi::space,              // skip whitespace
      letters);               // result
  BOOST_FOREACH(uchar letter, letters) {
    std::cout << letter << " ";
  }
  std::cout << std::endl;
}

Код печатает кодовые точки Юникода:

$ ./a.out 
1053 1072 1073 1077 1088 1077 1075 1091 1087 1091 1089 1090 1099 1085 1085 1099 1093 1074 1086 1083 1085 

, что кажется правильным, согласно официальному Таблица Unicode.

Теперь кто-нибудь может сказать мне, как вместо этого напечатать фактические символы, учитывая этот вектор кодовых точек Unicode?

9
задан Frank 7 May 2012 в 01:33
поделиться