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:文件路径没有问题,读写sqlite没有问题。 无论如何,将数据写入文件应该使用UTF-8编写。
  • Linux中的wchar_t:由于UTF-8编码导致的文件路径异常,在读取/写入sqlite(wchar_t)之前进行转换,以及在将数据写入文件时与windows相同。
  • 在阅读(这里)之后,我确信我应该坚持在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上支持_TLPCTSTR以及类似的方法来实现这一点,并且通过具有在std::stringstd::wstring之间轻松转换的泛型函数来实现这一点。 我们也有一个通用的std::basic_string<TCHAR>tstring ),我们在大多数情况下使用它。

    到目前为止,这工作得很好。 基本上大多数函数都需要一个tstring或一个LPCTSTR而那些不会从tstring转换它们的参数的函数。 这意味着大多数时候我们不会转换我们的字符串并通过大多数参数。

    链接地址: http://www.djcxy.com/p/54639.html

    上一篇: platform unicode in C/C++: Which encoding to use?

    下一篇: platform Java method to remove filename special chars?