库的字符串编码应该符合Unicode还是灵活的? 我创建了一个C++语言库,它公开了C风格的接口API。有些参数是字符串,因此它们应该是char*。现在我知道它们应该都是Unicode,但因为它是一个库,我不想强迫用户使用它。理想情况下,我认为最好使用TCHAR,这样我就可以为unicode代码和ASCII用户构建它。比我读到的要多,它总体上反对这个观点

库的字符串编码应该符合Unicode还是灵活的? 我创建了一个C++语言库,它公开了C风格的接口API。有些参数是字符串,因此它们应该是char*。现在我知道它们应该都是Unicode,但因为它是一个库,我不想强迫用户使用它。理想情况下,我认为最好使用TCHAR,这样我就可以为unicode代码和ASCII用户构建它。比我读到的要多,它总体上反对这个观点,c++,unicode,stl,mfc,static-libraries,C++,Unicode,Stl,Mfc,Static Libraries,作为API的一个示例,字符串是文件名或错误消息,如下所示 void LoadSomeFile(char * fileName ); const char * GetErrorMsg(); 我使用C++和STL。这场辩论也存在。 就我个人而言,我非常喜欢MFC的CString类,它很好地处理了所有这些问题,但这意味着我必须只为它的string类使用MFC 现在我认为TCHAR可能是我最好的解决方案,但是我必须使用CString(内部)才能工作吗?我可以用STL字符串吗?就我所见,它不是字符串就是

作为API的一个示例,字符串是文件名或错误消息,如下所示

void LoadSomeFile(char * fileName );
const char * GetErrorMsg();
我使用C++和STL。这场辩论也存在。 就我个人而言,我非常喜欢MFC的CString类,它很好地处理了所有这些问题,但这意味着我必须只为它的string类使用MFC


现在我认为TCHAR可能是我最好的解决方案,但是我必须使用CString(内部)才能工作吗?我可以用STL字符串吗?就我所见,它不是字符串就是wstring

TCHAR类型是一个不幸的设计选择,谢天谢地,它被我们抛在了后面。谢天谢地,没有人再需要使用
TCHAR
。Unicode也为我们做出了选择:Unicode是未来唯一明智的选择

问题是,您的库窗口是唯一的吗?还是便携式的

  • 如果您的库是可移植的,那么典型的选择是使用UTF-8编码字符串的
    char*
    std::string
    。有关详细信息,请参阅。概括地说,
    wchar\u t
    在Windows上是UTF-16,但在其他地方是UTF-32,这使得它对于跨平台编程几乎毫无用处

  • 如果您的库仅在Win32上运行,那么您可以随意使用
    wchar\t
    。在Windows上,
    wchar\u t
    是UTF-16


  • 不要两者都使用,这会使您的代码和API臃肿且难以阅读
    TCHAR
    是一种支持Win32 API并迁移到Unicode的技术。

    但是如果我使用
    char*
    我的库将不再与Unicode应用程序兼容,反之亦然。这将只在windows中使用,因此我不必担心交叉兼容性,但我确实希望使其同时适用于unicode和非unicode应用程序。@zadane:告诉用户通过将unicode字符串转换为UTF-8来传递unicode字符串。很多库都是这样工作的,我用过好几个。@zadane:我想你可能误解了
    char*
    不是Unicode。这是不准确的,
    char*
    实际上只是一种数据类型,“Unicode”是一种表示字符的方式。可以使用UTF-8在
    char*
    中存储Unicode字符串,使用UTF-16在
    short*
    中存储Unicode字符串,或者使用UTF-32在
    int*
    中存储Unicode字符串。
    wchar\u t
    类型基本上是
    short
    int
    (或其未签名版本),这取决于您是在Windows上还是在其他地方,但是
    char*
    在所有通用平台上都可用且一致。(此注释假设整数类型的宽度为典型宽度。)@Deitrich那么你是说我可以通过
    char*
    而仍然是unicode?理论上这应该是好的,但我想要的字符串,我可以很容易地操纵以及。TCHAR会根据项目/编码设置相应地转换为
    char*
    wchar\u t
    。是的,您可以传递
    char*
    ,但仍然是Unicode。它比
    TCHAR
    更容易操作。使用
    TCHAR
    ,您不知道使用的是什么编码,也不知道它是否是Unicode编码——非常难使用,非常令人沮丧。使用
    wchar\u t
    ,您不知道它是什么编码,但您知道它是Unicode编码的——仍然令人沮丧。如果你把UTF-8放在代码> char */COD>中,这在C和C++中是非常普遍的,那么你就知道你使用的是什么编码了,所以操作字符串非常容易。(请注意,该标准实际上并不要求
    wchar\u t
    为Unicode,但实际上是这样的。)