C / C ++中的平台unicode:使用哪种编码?
我目前正在开发一个可以在Windows和Linux上工作的业余爱好项目(C / C ++),并且全面支持Unicode。 可悲的是,Windows和Linux使用不同的编码,使我们的生活更加困难。
在我的代码中,我试图尽可能地使用数据,使Windows和Linux都变得简单。 在Windows中,默认情况下,wchar_t编码为UTF-16,Linux中编码为UCS-4(如果我错了,请纠正我)。
我的软件打开({_wfopen,UTF-16,Windows},{fopen,UTF-8,Linux}),并以UTF-8格式将数据写入文件。 到目前为止,这都是可行的。 直到我决定使用SQLite。
SQLite的C / C ++接口允许使用一个或两个字节的编码字符串(单击)。 当然,这在Linux中不适用于wchar_t,因为Linux中的wchar_t默认为4字节。 因此,从sqlite写入和读取需要转换为Linux。
目前,代码在Windows / Linux的例外情况下很混乱。 我希望坚持在wchar_t中存储数据的标准思想:
在阅读(这里)之后,我确信我应该坚持在Windows中使用wchar_t。 但是,在完成所有这些工作之后,麻烦从移植到Linux开始。
目前我正在考虑重做这一切,以坚持简单的字符(UTF-8),因为它适用于Windows和Linux,记住我需要'WideCharToMultiByte'在Windows中的每个字符串来实现UTF-8。 使用简单的基于char *的字符串将大大减少Linux / Windows的例外数量。
你有使用unicode跨平台的经验吗? 对使用UTF-8简单地存储数据而不是使用wchar_t的想法有什么想法?
所有平台上的UTF-8,即时转换为适用于Windows的UTF-16是跨平台Unicode的常用策略。
我们的软件也是跨平台的,我们也面临类似的问题。 我们决定,我们的目标是尽可能减少转换次数。 这意味着我们在Windows上使用wchar_t
,在Unix / Mac上使用char
。
我们通过在Unix上支持_T
和LPCTSTR
以及类似的方法来实现这一点,并且通过具有在std::string
和std::wstring
之间轻松转换的泛型函数来实现这一点。 我们也有一个通用的std::basic_string<TCHAR>
( tstring
),我们在大多数情况下使用它。
到目前为止,这工作得很好。 基本上大多数函数都需要一个tstring
或一个LPCTSTR
而那些不会从tstring
转换它们的参数的函数。 这意味着大多数时候我们不会转换我们的字符串并通过大多数参数。