C++ ICU与Boost在C++;

C++ ICU与Boost在C++;,c++,boost,unicode,c++11,icu,C++,Boost,Unicode,C++11,Icu,我正在考虑使用ICU或Boost语言环境 每种方法的优缺点是什么 我知道他们都使用ICU,但ICU被Boost Locale隐藏了。根据:“……整个ICU API隐藏在不透明指针后面,用户无法访问它。” P>在比较这些库时,请考虑C++中的新Unicode特性。< P> ICU是由国际化专家设计的,而Boost是由C++程序员设计的。 虽然强大而优雅的C++,Boost却大量的国际化错误。 现在,boost是一个庞大的库集合,有些库做得比其他库好。 但是ICU始终是坚固的,除了微软之外,几乎每

我正在考虑使用ICU或Boost语言环境

每种方法的优缺点是什么

我知道他们都使用ICU,但ICU被Boost Locale隐藏了。根据:“……整个ICU API隐藏在不透明指针后面,用户无法访问它。”


<> P>在比较这些库时,请考虑C++中的新Unicode特性。

< P> ICU是由国际化专家设计的,而Boost是由C++程序员设计的。

虽然强大而优雅的C++,Boost却大量的国际化错误。 现在,boost是一个庞大的库集合,有些库做得比其他库好。 但是ICU始终是坚固的,除了微软之外,几乎每个人都使用ICU作为基础。 所以,如果你想要坚实的国际化,就去重症监护病房。


如果你想要C++的边缘(但I18n类不稳定),去Boo.

ICU是很好的库,但它有缺点:

  • 在现代C++设计方面,API是很可怕的,它与标准C++库
  • 不太好。
  • 它是面向UTF-16的
  • 它的消息翻译工具远非完美,这就是Boost.Locale使用Gettext模型的原因
  • 见:

    STOST.LoaLL以C++方式进行本地化,并且允许使用除ICU之外的其他后端(当然ICU更好),这样在很多情况下,Boo.LoaLead提供了更好的本地化替代,因为它更简单,为现代C++设计,并且一般更易于使用。 当然,如果您需要Boost.Locale不支持的非常复杂的算法


    或者你的应用程序所做的一切都是Unicode处理,那么ICU可能更好,除了那个Boost。LoALE对于本地化C++应用程序更好。一些也可以由Boost.Locale使用。您可以考虑将Boo.LoalAL更好地连接到ICU。 -1。OP希望对ICU和Boost.locale进行比较。说“boost的国际化有很多错误”[…]boost是一个很大的库集合,有些库做得比其他库好“这完全离题。locale是一个应该包装ICU和GNUGettext的库,问题是包装得如何?直接使用ICU是否更好?答案有点含蓄:直接使用ICU。因为Boost.locale是一个包装器,所以它只能和ICU一样好或更差。它可能看起来比ICU更好,C++,但也可能引入额外的bug(我知道Mac OS X API包装ICU的情况下引入的bug不是在ICU)。此外,Boost.locale一直使用UTF-8。由于ICU在UTF-16上工作,这意味着所有调用都必须进行UTF-8到UTF-16的转换和返回,映射字符串偏移量等。这是一种性能损失,而且容易出错。看起来,在C++11中,您可以将std::u16string和UTF-16与Boost.locale一起使用。然而,根据佩奇的说法,“对C++0x char16_t和char32_t的支持是实验性的。”@MihaiNita:听起来你在传播一些好的老FUD。当然,库中可能包含bug,但是这些bug比用户代码中的bug更容易被社区发现和修复。使用设计良好且现代化的库作为Boost.Locale的好处是,用户代码中的bug可能比直接使用ICU更少。这些都是对Boost.Locale的严厉批评。例如,大多数升压子库根本不考虑I18N。它们被设计破坏了。对于如此有力的陈述,我们需要举一个例子。Boost.Locale的哪些设计缺陷使其“被设计破坏”?目前,我必须执行我的第一次国际化迁移,我来这里是为了寻求关于使用Boost.Locale是一个好主意,还是应该直接使用ICU的建议。不幸的是,你的批评对我没有用,因为你没有提供证据。也许你可以填写?我喜欢Boost Locale界面,但需要访问其他ICU函数,如u_isalpha()或u_isalnum(),我认为这些函数无法通过Boost Locale访问,除非我忽略了一些东西。如果没有,您是否计划将这些函数包装到Boost语言环境中?