setlocale(LC_CTYPE, NULL) 可能返回哪些值?

What are the possible values returned by setlocale(LC_CTYPE, NULL)?

我需要从命令行读取数据并以 UTF-8 格式存储数据。为此,我的方法是通过检索当前语言环境来确定哪个字符集正在使用命令行 shell。 (当然,如果您看到更好的方法,请分享您的想法!)

在尝试检测活动区域设置的 LC_CTYPE 值时应该期望什么值?

我正在使用下面的函数,它希望得到像“POSIX”或“C”这样的字符串,或者像“en_US.UTF-8”这样的字符串。

有谁知道是否还有其他可能的情况(即可能的值)?

(我关心的是确保我处理所有案件)

/* Retrieve the current charset using setlocale function.
 @return Returned value is a string holding the name of the current charset.  On error, function returns NULL. 
*/
char* get_charset() {
    // read environment locale for LC_CTYPE category
    setlocale(LC_CTYPE, "");
    char* locale = setlocale(LC_CTYPE, NULL);    
    if (strstr(locale, ".") != NULL) {
      // return codeset (last block of chars preceeded by a dot)
      return strrchr(locale, '.')+1;
    }
    return locale;
}

实际上,POSIX 定义了一个 "Portable character set",它是 ASCII 的一个子集,并且应该是任何符合标准的字符集的一部分。

至于setlocale()函数,平台不使用official GNU documentation states that when XPG syntax(即OS),"C"是后备值,意思是"POSIX compliant".
此外,返回值是一个字符指针 (char*),因此结果应该始终是字符串或 NULL.

所以,这里是问题的答案:

  1. 是的。给定的代码段应涵盖所有情况。
  2. 如果想法是将结果存储为 UTF-8,则在 get_charset() 函数 returns 'C' 的情况下不需要转换,因为这意味着使用的字符集是兼容的使用 ASCII,而 ASCII 又与 UTF-8
  3. 兼容