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

标签 c character-encoding locale

我需要从命令行读取数据并以 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指出当 XPG syntax不被平台(即操作系统)使用,“C”是后备值,表示“POSIX 兼容”。
此外,返回值是一个字符指针(char*),因此结果应始终为字符串或NULL

所以,以下是问题的答案:

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

关于c - setlocale(LC_CTYPE, NULL) 可能返回哪些值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58866245/

相关文章:

c++ - 设置区域设置后输入 4 位数字时,operator>> 返回失败

count_word 函数在 C 中返回 0

MySQL错误1300(HY000): Invalid utf8mb4 character string

ruby-on-rails - number_to_currency 语言环境转换

java - Jersey ResponseBuilder 文件名编码

sql - 如何查看 MySQL 数据库/表/列的字符集是什么?

java - 为什么 YAML 解析出来的时间戳不对?

C- Readline() undefined reference

c - 使用 C 中的 getopt_long 解析终端中的选项参数

c - execvp 在 c 中返回权限被拒绝的错误