使用boost语言环境库检索代码点

时间:2016-02-18 09:14:17

标签: c++ boost unicode locale

从给定的unicode字符串中我想检索构成字符串的代码点列表。为此,我从Boost's character iteration example复制了以下示例:

#include <boost/locale.hpp>

using namespace boost::locale::boundary;

int main()
{
    boost::locale::generator gen;
    std::string text="To be or not to be";

// Create mapping of text for token iterator using global locale.
    ssegment_index map(character,text.begin(),text.end(),gen("en_US.UTF-8"));

// Print all "words" -- chunks of word boundary
    for(ssegment_index::iterator it=map.begin(),e=map.end();it!=e;++it)
    {
        std::cout <<"\""<< * it << "\", ";
    }

    std::cout << std::endl;
    return 0;
}

它返回我的字符(根据Boost的文档与代码点不同),如下所示:

"T", "o", " ", "b", "e", " ", "o", "r", " ", "n", "o", "t", " ", "t", "o", " ", "b", "e",

我读到使用boost::locale::util::base_converter class中的to_unicode函数可以检索给定字符串的代码点。但我不确定如何。我尝试了以下代码,但没有帮助:

for(ssegment_index::iterator it=map.begin(),e=map.end();it!=e;++it)
{
    std::cout <<"\""<< * it << "\", ";
    boost::locale::util::base_converter encoder_decoder;
    virtual uint32_t test1 = encoder_decoder.to_unicode(it->begin(),it->end() );
}

返回“类型不匹配”错误。我认为to_unicode()函数的参数必须是不同的

我正在考虑仅使用Boost来检索代码点而不是现有的解决方案,例如herehere,因为Boost提供了许多有用的功能来识别各种类型的“换行符,分词符号等”语言。

1 个答案:

答案 0 :(得分:0)

要获取代码点,您可以使用boost::u8_to_u32_iterator。这是因为UTF-32字符等于其代码点。

#include <boost/regex/pending/unicode_iterator.hpp>
#include <string>
#include <iostream>

void printCodepoints(std::string input) {
    for(boost::u8_to_u32_iterator<std::string::iterator> it(input.begin()), end(input.end()); it!=end; ++it)
        std::cout <<"\""<< * it << "\", ";
}

int main() {
    printCodepoints("Hello World!");
    return 0;
}