用std :: u16string替换std :: stringstream和boost :: format的用途是什么?

时间:2012-09-01 17:32:41

标签: c++ unicode c++11

std :: iostream类缺少char16_t和char32_t的特化,而boost :: format依赖于stream。如何用utf16字符串替换流(最好是本地化支持)?

3 个答案:

答案 0 :(得分:2)

工作的基本实体流是字符,而不是编码字符。对于Unicode,决定将一个字符分割为多个实体,使其与流抽象本质上不兼容。

添加了新的字符类型,旨在处理处理Unicode字符的标准方法,但它被认为过于复杂,无法重做IOStream和locales的行为以保持增加的复杂性。这部分是由于人们不太喜欢流,部分是由于这是一项庞大而重要的任务。我认为所需的方面可以定义为能够处理简单的情况,但我不确定这是否会导致快速解决方案,如果它将覆盖需要Unicode的语言:我可以看到它是如何为欧洲文本工作,但我不知道是否真的适用于亚洲文本。

答案 1 :(得分:1)

这很好。编码论证已经结束并且已经解决了。您不希望程序中的任何地方使用utf16字符串,除非与旧API通信时,即转换整个格式化字符串时,最好通过boost :: narrow和widen完成。当然,除非您正在进行一些罕见的边缘优化。

请参阅http://utf8everywhere.org

答案 2 :(得分:0)

当前流通常作为模板实现(我这里没有标准的副本,但我很确定它们必须作为模板实现)所以使它们具有宽字符串感知应该是一个简单的使用适当的字符类型实例化模板的问题。

您的实现很可能已经为宽字符串预定义了特化。看看像std :: wstringstream。

也就是说,C ++中的各种字符类型都没有对你放在那里的字符串的编码做任何假设,所以你要把它作为“按惯例”的方式来处理 - 就像你的宽字符串一样按惯例编码为utf16,但库中没有任何内容强制执行此约定。