【问题标题】:getenv - Environment variable on Mac OS X and Linuxgetenv - Mac OS X 和 Linux 上的环境变量
【发布时间】:2013-05-04 22:15:52
【问题描述】:

getenv 用于访问 Mac OS X 和 Linux 上的环境变量,它以char* 作为输入。这是否意味着我不能将 UNICODE 字符串作为值存储在这些系统上的这些环境变量中?

在 Windows GetEnvironmentVariable 等上,返回可以容纳 UTF16 字符串的宽字符串。

【问题讨论】:

  • 或者getenv返回的字符串的编码是什么? UTF8?
  • POSIX 规范对环境变量值有这样的说法:“环境变量可以分配的值不受限制,除非它们被认为以空字节结尾,并且总空间用于存储环境,进程的参数限制为 {ARG_MAX} 个字节。"所以 UTF8 在某种意义上应该没问题。但它也说:“对于在符合 IEEE Std 1003.1-2001 的系统之间可移植的值,该值应由可移植字符集中的字符组成(NUL 除外,如下所示)”
  • 您想要一个带有 UTF-8 字符串的环境变量的确切目的是什么?

标签: c linux macos environment-variables


【解决方案1】:

当时,Unix 系统的发明并没有考虑到宽字符串。所以不可能创建或读取宽字符串环境变量。
对于 Windows,有 C-Runtime wchar_t *_wgetenv( const wchar_t *varname ); 的扩展,但这不会在 Unix 系统上给你太多用处。

【讨论】:

    【解决方案2】:

    在当前的 Linux(可能还有 MacOSX)上,UTF-8 编码字符串非常常见。 (但也有例外,见locale命令等...)。

    正如Michael Burr 所评论的,您可以假设getenv 正在返回一个UTF-8 字符串。但是,如果您想要最大的可移植性,请仅在环境变量中使用 ASCII。

    从 C 或 C++ 程序员的角度来看,getenv(3) 返回 char *,您可能希望使用 UTF-8 相关函数来处理它。请注意,getenv 不会返回 wchar_t* 指针。

    请参阅locale(7) 手册页并注意当前语言环境可以由环境变量定义,例如LANGLC_ALL 等...请参阅environ(7)

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2010-10-10
      • 2014-06-10
      • 2017-07-08
      • 2013-11-27
      • 2011-11-22
      相关资源
      最近更新 更多