库的字符串编码应该符合Unicode还是灵活的? 我创建了一个C++语言库,它公开了C风格的接口API。有些参数是字符串,因此它们应该是char*。现在我知道它们应该都是Unicode,但因为它是一个库,我不想强迫用户使用它。理想情况下,我认为最好使用TCHAR,这样我就可以为unicode代码和ASCII用户构建它。比我读到的要多,它总体上反对这个观点
作为API的一个示例,字符串是文件名或错误消息,如下所示库的字符串编码应该符合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字符串吗?就我所见,它不是字符串就是
void LoadSomeFile(char * fileName );
const char * GetErrorMsg();
我使用C++和STL。这场辩论也存在。
就我个人而言,我非常喜欢MFC的CString类,它很好地处理了所有这些问题,但这意味着我必须只为它的string类使用MFC
现在我认为TCHAR可能是我最好的解决方案,但是我必须使用CString(内部)才能工作吗?我可以用STL字符串吗?就我所见,它不是字符串就是wstring TCHAR类型是一个不幸的设计选择,谢天谢地,它被我们抛在了后面。谢天谢地,没有人再需要使用
TCHAR
。Unicode也为我们做出了选择:Unicode是未来唯一明智的选择
问题是,您的库窗口是唯一的吗?还是便携式的
char*
或std::string
。有关详细信息,请参阅。概括地说,wchar\u t
在Windows上是UTF-16,但在其他地方是UTF-32,这使得它对于跨平台编程几乎毫无用处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,但实际上是这样的。)