库的字符串编码是否符合Unicode或灵活

Should string encoding for library conform to Unicode or flexible?

本文关键字:Unicode 字符串 编码 是否      更新时间:2023-10-16

我用c++创建了一个库,它暴露了C风格的接口api。有些参数是字符串,所以它们是char *。现在我知道它们应该都是Unicode,但因为它是一个库,我不认为我想强迫用户使用决定或不。理想情况下,我认为最好使用TCHAR,这样我就可以为unicode代码和ASCII用户构建它。然后我读了这篇文章,它基本上反对这个想法。

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

void LoadSomeFile(char * fileName );
const char * GetErrorMsg();

我使用c++和STL。std::string和std::wstring之间也存在争议。就我个人而言,我真的很喜欢MFC的CString类,它很好地处理了所有这些,但这意味着我必须为它的字符串类使用MFC。

现在我认为TCHAR对我来说可能是最好的解决方案,但我是否必须使用CString(内部)才能工作?我可以使用STL字符串吗?据我所知,这里不是string就是wstring。

TCHAR类型是一个不幸的设计选择,幸运的是我们已经离开了。没有人需要再使用TCHAR了,谢天谢地。Unicode的选择也已经为我们做好了:Unicode是未来唯一合理的选择。

问题是,你的库只支持windows吗?还是便携的?

  1. 如果您的库是可移植的,那么典型的选择是char *std::string与UTF-8编码字符串。有关更多信息,请参阅UTF-8 Everywhere。总的来说,wchar_t在Windows上是UTF-16,但在其他地方是UTF-32,这使得它对于跨平台编程几乎毫无用处。

  2. 如果你的库只在Win32上运行,那么你可以自由地使用wchar_t代替。在Windows上,wchar_t是UTF-16

不要同时使用,这会使你的代码和API变得臃肿且难以阅读。TCHAR是一个支持Win32 API和迁移到Unicode的hack。