代码之家  ›  专栏  ›  技术社区  ›  Frerich Raabe

如何避免C/C++ API中字符串的混合编码?

  •  4
  • Frerich Raabe  · 技术社区  · 16 年前

    const char *getTranslatedWord( const char *englishWord );
    

    现在,假设我想强制所有字符串都以UTF-8的形式传递,当然我会记录这个要求,但是我希望编译器强制使用正确的编码,可能是通过使用专用类型。例如,类似这样的情况:

    class Word {
    public:
      static Word fromUtf8( const char *data ) { return Word( data ); }
      const char *toUtf8() { return m_data; }
    
    private:
      Word( const char *data ) : m_data( data ) { }
    
      const char *m_data;
    };
    

    我现在可以在API中使用这种特殊类型:

    Word getTranslatedWord( const Word &englishWord );
    

    不幸的是,这很容易使它非常低效。这个 Word 类缺少适当的复制构造函数、赋值运算符等。。我希望尽可能避免不必要的数据复制。同时,我也看到了 文字 使用越来越多的实用函数(如 length fromLatin1 substr

    编辑: 在我的特殊情况下,API在Windows和Linux上使用,在Windows和gcc 3上使用MSVC 6-MSVC 10&4在Linux上。

    3 回复  |  直到 16 年前
        1
  •  4
  •   JoeG    16 年前

    您可以传递std::对而不是char*:

    struct utf8_tag_t{} utf8_tag;
    std::pair<const char*,utf8_tag_t> getTranslatedWord(std::pair<const char*,utf8_tag_t> englishWord);
    

    在使用std::pair空基类优化的现代编译器上,生成的机器代码应该是相同的。


    不过,我不在乎这个。我只需要使用char*s和文档,输入必须是utf8。如果数据可能来自不受信任的源,那么无论如何都必须在运行时检查编码。

        2
  •  1
  •   Community Mohan Dere    9 年前

    我建议你用 std::wstring .

    this

        3
  •  0
  •   jopa    16 年前

    这个 ICU