Как я могу сопоставить символы Юникода 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?