我参与了C库。它有一个函数,它为文件路径名提供char*
参数。作者大多是UNIX开发人员,这在unix上工作正常,其中char*
主要是指UTF-8。 (至少in GCC,字符集是可配置的,UTF-8是默认值。)
但是,char*
表示Windows上的ANSI,这意味着目前无法在Windows上使用此库的Unicode路径名,其中应使用wchar_t*
且仅支持UTF-16。 (A quick search on StackOverflow表明ANSI Windows API函数不能与UTF-8一起使用。)
问题是,解决这个问题的正确方法是什么?我们已经提出了各种方法来做到这一点,但我们都不是Windows专家,所以我们无法真正决定如何正确地做到这一点。我们的目标是库的用户应该能够编写可以在unix和windows上工作的跨平台代码。
在幕后,库有#ifdef
来区分操作系统,以便它可以在UNIX上使用POSIX功能,在Windows上使用Win32 API。
到目前为止,我们已经提出了以下可能性:
wchar_t*
。#ifdef
库标题,以便该函数在Windows上接受wchar_t*
。char*
强制转换为wchar_t*
并调用widechar Windows API。选项1-4的问题在于它们需要用户有意识地自己处理可移植性。选项5听起来不错,但我不确定这是否是正确的方法。
我也对可以解决此问题的其他建议或想法持开放态度。 :)
答案 0 :(得分:2)
由于可移植性是您的重要目标,因此我认为必须精确定义函数语义。除其他外,这意味着参数'类型和含义不同平台不同。因此,如果您有一个接受常规char
路径的函数,那么它应该在所有系统上接受这样的路径,并且这些路径的预期编码应该是明确定义的(这并不一定意味着"相同&#34)。这排除了选项(2)和(3)。
此外,可移植性要求相同的功能可在所有平台上使用;排除(1)。如果基于流和/或文件描述符的方法是库提供的唯一方法,则选项(4)可以是正常的,但它仅针对这些函数产生可移植性,而不是基于路径的函数。 (请注意,流(FILE *
)API由C定义,而文件描述符是POSIX概念,而不是C本机。因此,原则上,流比文件描述符更便携。)
(5)可以起作用,但它会产生比实际需要更强的约束。函数定义期望的编码并不是必需的(虽然它可以);它足以定义如何确定编码。
此外,您可以添加基于wchar_t
的无处不在的功能(而不是仅限Windows)。那些对Windows用户来说可能更方便。但是,与替代方案(4)类似,仅提供与这些功能相关的可移植性。假设您不想放弃基于char
的那些,您需要将此替代方案与(5)中的某些变体配对。