我目前正在开发一个爱好项目 (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 的想法有什么想法吗?