gpt4 book ai didi

c - 如何处理跨平台 C 库中的 Unicode 路径?

转载 作者:可可西里 更新时间:2023-11-01 09:28:44 25 4
gpt4 key购买 nike

我正在为 C 语言库做贡献。它有一个函数,该函数采用 char* 参数作为文件路径名。作者大多是 UNIX 开发人员,这在 char* 主要表示 UTF-8 的 unix 上运行良好。 (至少 in GCC ,字符集可配置,默认为 UTF-8。)

但是,char* 在 Windows 上表示 ANSI,这意味着目前无法在 Windows 上使用此库的 Unicode 路径名,而应该使用 wchar_t*并且仅支持 UTF-16。 (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 库 header ,以便该函数在 Windows 上接受 wchar_t*
  3. 添加一个标志,告诉函数将给定的 char* 转换为 wchar_t* 并调用 widechar Windows API。
  4. 创建采用文件描述符(或 Windows 上的文件句柄)而不是文件路径的函数变体。
  5. 始终需要 UTF-8(即使在 Windows 上),然后在函数内部将 UTF-8 转换为 UTF-16 并调用 widechar Windows API。

选项 1-4 的问题在于它们需要用户自己有意识地照顾可移植性。选项 5 听起来不错,但我不确定这是否是正确的方法。

我也乐于接受可以解决此问题的其他建议或想法。 :)

最佳答案

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

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

(5) 可以工作,但它施加的约束比您实际需要的要强。函数定义预期的编码不是必需的(尽管它可以);它足以定义如何确定该编码。

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

关于c - 如何处理跨平台 C 库中的 Unicode 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com