是否有适用于STL和UTF-8的ICU C++包装器,或其他强大的Unicode库?

25
我需要一个适用于C++的好的Unicode库,需要满足以下要求:
  1. 以Unicode敏感的方式进行转换。例如,按不区分大小写的方式对所有字符串进行排序,并获取它们的第一个字符作为索引。将各种Unicode字符串转换为大写和小写。在合理的位置拆分文本——适用于中文和日文的单词。
  2. 以本地化敏感的方式格式化数字、日期(应该是线程安全的)。
  3. 支持UTF-8(主要内部表示)。
据我所知,最好的库是ICU。但是,我找不到正常的开发人员友好的带有示例的API文档。同时,我发现它与现代C++设计、STL等不太兼容。
std::string msg;
unistring umsg.from_utf8(msg);
unistring::word_iterator wi;
for(wi=umsg.words().begin(),n=0;wi!=usmg.words().wi_end(),n<10;++wi,++n) 
  ;
msg=umsg.substr(umsg.words().begin(),wi).to_utf8();
cout<<_("Five 10 words are ")<<msg;

是否有一个基于开源许可的好的STL友好的ICU包装器?首选是像MIT或Boost这样的许可证,但其他许可证如LGPLv2兼容也可以。

是否有另一个类似于ICU的高质量库?

平台:Unix / POSIX,不需要支持Windows。

编辑:不幸的是我没有登录,所以我不能接受答案。我已经附上了自己的答案。


6
哦,对这个问题点个赞。在我看来,像 ICU 这样大的库完全没有遵循常见的 C++ 习惯用法,这令人困惑。 - jalf
3个回答

21

这太棒了。你提交了Boost吗? - Pavel Minaev
我已经开始了初步的预备过程 - 在正式提交之前。请关注boost邮件列表。 - Artyom
@Artyom:是的,我正在关注Boost邮件列表。我非常感谢你的努力。然而,Boost.Locale远远不是ICU的完整封装。我对进行一些双向转换很感兴趣,但我在Boost.Locale中找不到它。计划将其添加到其中吗?我能提供帮助吗? - Yakov Galka
1
@ybungalobill:“我需要将ISO-8859-8视觉(遗留,不是我的选择)按逻辑顺序转换为UTF-8。”你不能使用BiDi算法来做到这一点,因为BiDi算法是逻辑->视觉而不是相反。实际上,从视觉到逻辑的转换并没有很好地定义,同一视觉内容可能有多个“逻辑”版本。甚至在任何两个代码点之间添加最简单的LRM或RLM(取决于文本方向)都会给出转换为UTF-8的结果。 - Artyom
@Artyom:如果假设没有使用方向标记,则其定义是明确的。ICU 对此提供了支持。无论如何,您并没有回答我的问题,即您在 Boost.Locale 方面的计划是什么。 - Yakov Galka
显示剩余4条评论

1

wxWidgets GUI 工具包拥有一些非常好的字符串类和 Unicode 支持。如果您不想使用 GUI 类,也无需构建它们。有关详细信息,请参见此处


1

似乎只提供了所需功能的一小部分。它仅允许处理UTF-8字符串,但不支持转换为小写/大写、格式化数字等操作。 - Joachim Sauer
True - 它仅用于处理utf-8字符串,但可以轻松地与Boost String Algorithms配合使用。当然,即使如此,它也不能替代ICU。 - Nemanja Trifunovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接