Boost locale比较抛出EXC_BAD_ACCESS

时间:2016-10-01 17:58:18

标签: c++ xcode boost locale collation

以下微不足道的Boost语言环境库使用会产生运行时错误:

#include <boost/locale.hpp>

int main(int argc, const char * argv[]) {

    boost::locale::generator gen;
    std::locale loc = gen("");
    std::locale::global(loc);

    std::wstring a=L"Façade", b=L"facade";

    bool eq = std::use_facet<boost::locale::collator<wchar_t>>(loc).compare(
        boost::locale::collator_base::secondary,
        a, b
    ) == 0;

    if (eq) std::cout << "OK" << std::endl;

    return 0;
}

调试器在collat​​or.hpp中捕获错误:

int compare(level_type level,string_type const &l,string_type const &r) const
{
    ---> return do_compare(level,l.data(),l.data()+l.size(),r.data(),r.data()+r.size());
}

错误是&#34;线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0)&#34;

我正在使用Xcode 8.0(8A218a)和boost-1.61.0_1运行macOS Sierra版本10.12的2013年末iMac。希望我可能只是没有用Boost安装ICU,我只是跑了这个:

brew install boost --with-icu4c --cxx11

此示例基于Boost自己的文档:

http://www.boost.org/doc/libs/1_49_0/libs/locale/doc/html/index.html

思考?谢谢。

----编辑-----

我尝试转出有关默认语言环境的信息:

std::cout << std::use_facet<boost::locale::info>(loc).name() << std::endl;

它只包含&#34; C&#34;其他属性不是我的预期。因此我在我的设置中明确了:

boost::locale::generator gen;
std::locale loc = gen("en_US.UTF-8");
std::locale::global(loc);

std::cout << std::use_facet<boost::locale::info>(loc).name() << std::endl;
std::cout << std::use_facet<boost::locale::info>(loc).language() << std::endl;
std::cout << std::use_facet<boost::locale::info>(loc).country() << std::endl;
std::cout << std::use_facet<boost::locale::info>(loc).variant() << std::endl;
std::cout << std::use_facet<boost::locale::info>(loc).encoding() << std::endl;
std::cout << std::use_facet<boost::locale::info>(loc).utf8() << std::endl;

哪个输出:

en_US.UTF-8
en
US

utf-8
1

可悲的是,这没有用。另外,我注意到以下代码没有按预期工作:

const std::string g = "grüßEN";
std::cout << boost::locale::normalize(g, boost::locale::norm_nfc) << std::endl;
std::cout << boost::locale::normalize(g, boost::locale::norm_nfd) << std::endl;
std::cout << boost::locale::normalize(g, boost::locale::norm_nfkc) << std::endl;
std::cout << boost::locale::normalize(g, boost::locale::norm_nfkd) << std::endl;

输出所有相同的字符串:

grüßEN
grüßEN
grüßEN
grüßEN

这似乎暗示我安装Boost或ICU会有些麻烦。

0 个答案:

没有答案