9

我目前正在开发一个爱好项目 (C/C++),它应该可以在 Windows 和 Linux 上运行,并完全支持 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:文件路径没有问题,读取/写入 sqlite 没有问题。无论如何,都应该以 UTF-8 将数据写入文件。
  • Linux 中的 wchar_t:由于 UTF-8 编码、读取/写入到 sqlite (wchar_t) 之前的转换以及将数据写入文件时的 windows 相同,文件路径例外。

阅读(此处)后,我确信我应该在 Windows 中坚持使用 wchar_t。但在完成所有这些工作之后,麻烦就从移植到 Linux 开始了。

目前我正在考虑重做这一切以坚持使用简单的字符(UTF-8),因为它适用于 Windows 和 Linux,请记住我需要在 Windows 中的每个字符串“WideCharToMultiByte”以实现 UTF-8。使用简单的基于 char* 的字符串将大大减少 Linux/Windows 的异常数量。

你有跨平台使用 unicode 的经验吗?关于简单地将数据存储在 UTF-8 中而不是使用 wchar_t 的想法有什么想法吗?

4

2 回答 2

7

所有平台上的 UTF-8,在 Windows 上即时转换为 UTF-16 是跨平台 Unicode 的常用策略。

于 2012-06-28T00:21:37.643 回答
2

我们的软件也是跨平台的,我们也面临类似的问题。我们决定我们的目标是尽可能减少转化次数。这意味着我们wchar_t在 Windows 和charUnix/Mac 上使用。

我们通过在 Unix 上支持_T和和类似以及通过具有在和LPCTSTR之间轻松转换的通用函数来做到这一点。我们还有一个在大多数情况下使用的通用( )。std::stringstd::wstringstd::basic_string<TCHAR>tstring

到目前为止,这工作得很好。基本上大多数函数都采用 atstring或 a LPCTSTR,而那些没有的函数将从 a 转换它们的参数tstring。这意味着大多数时候我们不会转换字符串并传递大多数参数。

于 2012-06-28T00:41:46.067 回答