如何处理c ++中unicode支持所涉及的代码重复

时间:2016-06-22 03:00:14

标签: c++ unicode

目前在c ++中处理unicode支持的最佳方法是什么?

说我有一个像这样的简单函数:

std::wstring window::getTypeW(){
    return createType;
}

我可以添加一个简单的非宽函数,如下所示:

std::string window::getType(){
    std::string stype(createType.begin(),createType.end());
    return stype;
}

这不是什么大问题,但是当函数变得更复杂时,变体有很多选项。

示例:

int window::attachMenu(const std::string& str){
    if (veil.menu!=NULL){
        DestroyMenu(veil.menu);
        veil.menu=NULL;
    }

    ulti::element el;
    el.setStr(str);

    recurseElementForMenu(veil.menu,el,this);
    return 1;
}

选项:

  1. 我们可以复制代码,使广泛和非广泛的变体同样快速。

  2. 我们可以在字符串和wstring之间进行即时转换,从而消除重复的代码。

  3. 在某些情况下,我们可以使用模板(我知道如何使这项工作在使用时需要为每个函数显式输入)

  4. 我们可以使用...宏...并让用户手动选择unicode支持。

  5. 要点:

    这适用于我的小GUI库(它工作得很好,减去深度unicode支持)所以我想做出最好的长期决策 - 看起来支持数百个重复功能似乎是一场噩梦。但是因为这是一个库,我确实希望尽可能少的处理时间...所以转换似乎是一个更大的浪费。

    问题:

    简单地支持unicode并完全取消非unicode支持在新的库中是否可以接受?

    是否有一些方法可以让我为unicode和unicode制作单一功能?

    还有其他方法我没考虑过吗?

2 个答案:

答案 0 :(得分:2)

解决这个问题的一个显而易见的方法是尽可能简单地做到这一点。

在你的系统中,use UTF-8. All the time.当你与一个需要别的东西的系统对话时,将你的UTF-8字符串转换成其他东西"其他东西"也许。当系统以其他格式传回一个字符串时,几乎立即将其转换为UTF-8。

这样,您就不必在系统范围内进行任何代码重复。特定于平台的格式仅用于系统的外围。

这会影响性能吗?有可能。但可能并不明显,除非你有一个非常糟糕的UTF-8到UTF-16转换器。

答案 1 :(得分:0)

统一您的任何non-ascii邮件的编码,建议使用UTF-8。以下是How-to

  • 保持源代码文件UTF-8编码。使用iconv(在Linux下,或者 cygwin)如果允许,将文件转换为UTF-8编码文件。
  • 如果源代码文件不是UTF-8(或消息部分),请使用 LibIconv(也可在Windows上使用)转换为UTF-8。