【问题标题】:Getting environment Variables as UTF-8 Strings in Linux在 Linux 中以 UTF-8 字符串形式获取环境变量
【发布时间】:2023-03-29 22:53:02
【问题描述】:

我正在尝试将应用程序从 Windows 移植到 linux。 在 windows 中,我在 windows.h 中有一个 GetEnvironmentStrings() 函数,它以 NAME=VALUE 的形式为我提供当前进程中的环境变量及其值。 对于 Linux,我使用这样的环境变量

for (char **en=environ; *en; en++)   {
    std::string str(*en)
    env.push_back(str);      //env is a vector of strings
}

该应用程序似乎仍然无法正常工作。在 Windows 中,当我打印传递给 env 向量(字符串向量)的字符串大小时,它会将所有字符串的大小打印为 48 个字节。 而在 Linux 上大小为 8。原始应用程序使用 Unicode 版本 (GetEnvironmentStringsW) 和 使用转换函数 WideCharToMultiByte 将返回的宽字符串转换为 8 位字符串。

我没有足够的关于字符编码的知识,但我想这与字符串的编码方式有关。 知道可能出了什么问题吗?

【问题讨论】:

  • 您是否在寻找 getenv(3) 和 setenv(3) (linux.die.net/man/3/getenv)?
  • 你的代码看起来不错。 ideone.com/jUF5k如何打印字符串的大小?
  • environ 来自哪里?
  • @Code-Guru environ 可能来自main(int argc, char *argv[], char *environ[]) 的第三个参数。或者它只是通常可用的extern char **environ
  • @bames53 我没有尝试在 Linux 中以这种方式访问​​环境变量,所以这对我来说是新的。我想我在需要环境变量的极少数情况下使用了 getenv()。

标签: c++ linux unicode environment-variables


【解决方案1】:

这似乎是相关的:

Linux: where are environment variables stored?

为了给现有的环境变量设置一个值,我们使用赋值表达式。例如,要将“LANG”变量的值设置为“he_IL.UTF-8”,我们使用以下命令:

LANG=he_IL.UTF-8

https://help.ubuntu.com/community/EnvironmentVariables

或者,您可以使用system() 执行终端命令来获取环境变量。该页面会告诉您要包​​含哪些库以及正确的使用信息。

【讨论】:

    【解决方案2】:

    在 Windows 上,每个环境变量的大小都相同,这一事实非常可疑。我怀疑您没有正确打印尺寸,这与任何编码无关。

    #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
        std::vector<std::string> env;
        for (char **en=environ; *en; en++)   {
            std::string str(*en);
            std::cout << str.size() << '\n';
            env.push_back(str);
        }
    }
    

    http://ideone.com/If9ut

    18
    33
    16
    16
    17
    7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2014-06-04
      相关资源
      最近更新 更多