【发布时间】:2012-06-29 11:49:23
【问题描述】:
我目前正在从事一个爱好项目 (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++ 接口允许一个或两个字节的编码字符串 (click)。 当然这不适用于 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 相同,文件路径例外。
在阅读 (here) 之后,我确信我应该在 Windows 中坚持使用 wchar_t。但在完成所有这些工作之后,问题就从移植到 Linux 开始了。
目前我正在考虑重做这一切以坚持使用简单的 char(UTF-8),因为它适用于 Windows 和 Linux,请记住我需要在 Windows 中为每个字符串“WideCharToMultiByte”以实现 UTF -8。使用简单的基于 char* 的字符串将大大减少 Linux/Windows 的异常数量。
您有跨平台使用 unicode 的经验吗?关于简单地将数据存储在 UTF-8 中而不是使用 wchar_t 的想法有什么想法吗?
【问题讨论】:
-
2byte 字符编码绝对是不是 UTF-16。 UTF-16 是 2 到 4 个字节,而 UTF-8 是 1 - 4 个字节。 Windows
wchar_t不是 UTF-16,它是 UCS2。实际上,您可能不会注意到差异,因为 UCS2 涵盖了 BMP,但如果您的用户决定他们必须在 Ogham 或符文中拥有数据... -
Windows 使用 UTF-16,并且使用
wchar_t来保存 UTF-16 数据,并且从 Windows 2000 开始就一直这样做。 -
关于 wchar_t 的用途和用途:stackoverflow.com/a/11107667/365496
-
@RemyLebeau:我认为这取决于上下文。例如,您可以设置一个无效的 Unicode 密码,而控制台函数(例如 WriteConsoleOutputCharacter)似乎只允许在每个控制台坐标处使用一个 16 位字(可能解释为 UCS2)。
-
utf8everywhere.org 几乎可以在网站的 URL 中回答这个问题 :)
标签: windows linux unicode cross-platform wchar-t