如何在跨平台C库中处理Unicode路径?

时间:2015-01-30 17:00:00

标签: c windows unicode cross-platform libraries

我参与了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。

到目前为止,我们已经提出了以下可能性:

  1. 提供单独的仅限Windows的功能,可接受wchar_t*
  2. 要求Windows上的UTF-16和#ifdef库标题,以便该函数在Windows上接受wchar_t*
  3. 添加一个标志,告诉函数将给定的char*强制转换为wchar_t*并调用widechar Windows API。
  4. 创建函数的变体,该函数采用文件描述符(或Windows上的文件句柄)而不是文件路径。
  5. 始终需要UTF-8(即使在Windows上),然后在函数内部,将UTF-8转换为UTF-16并调用widechar Windows API。
  6. 选项1-4的问题在于它们需要用户有意识地自己处理可移植性。选项5听起来不错,但我不确定这是否是正确的方法。

    我也对可以解决此问题的其他建议或想法持开放态度。 :)

1 个答案:

答案 0 :(得分:2)

由于可移植性是您的重要目标,因此我认为必须精确定义函数语义。除其他外,这意味着参数'类型和含义不同平台不同。因此,如果您有一个接受常规char路径的函数,那么它应该在所有系统上接受这样的路径,并且这些路径的预期编码应该是明确定义的(这并不一定意味着"相同&#34)。这排除了选项(2)和(3)。

此外,可移植性要求相同的功能可在所有平台上使用;排除(1)。如果基于流和/或文件描述符的方法是库提供的唯一方法,则选项(4)可以是正常的,但它仅针对这些函数产生可移植性,而不是基于路径的函数。 (请注意,流(FILE *)API由C定义,而文件描述符是POSIX概念,而不是C本机。因此,原则上,流比文件描述符更便携。)

(5)可以起作用,但它会产生比实际需要更强的约束。函数定义期望的编码并不是必需的(虽然它可以);它足以定义如何确定编码。

此外,您可以添加基于wchar_t无处不在的功能(而不是仅限Windows)。那些对Windows用户来说可能更方便。但是,与替代方案(4)类似,仅提供与这些功能相关的可移植性。假设您不想放弃基于char的那些,您需要将此替代方案与(5)中的某些变体配对。