nl_langinfo() - 信息太多了

时间:2013-10-07 18:16:56

标签: c localization locale glibc

函数nl_langinfo(INT_CURR_SYMBOL)返回一个指向字符串常量的指针,格式为:

$(THREE-LETTER-PSEUDOACRONYM) $(SIGN)$(SYMBOL)

所以在我的语言环境(en_GB.UTF-8)中,这将是"GBP -£"。我只想要前三个字母,那么除了将nul字符分配给第三个元素,还是使用strncpy()之外,还有另一种方法吗?

strcpy(int_curr_symbol, nl_langinfo(INT_CURR_SYMBOL));  // "GBP -£"
int_curr_symbol[3] = '\0';

// or

strncpy(int_curr_symbol, nl_langinfo(INT_CURR_SYMBOL), 3));  // "GBP"

此外,nl_langinfo(CRNCYSTR)也会返回符号和符号,而只返回所需的符号。 "-£" - > "£"

1 个答案:

答案 0 :(得分:1)

INT_CURR_SYMBOL似乎是GNU扩展。我会建议localeconv()int_curr_symbol的{​​{1}}字段。这是来自POSIX规范的字段:

  

适用于当前区域设置的国际货币符号。前三个字符包含符合ISO 4217:1995标准中规定的字母国际货币符号。第四个字符(紧接在空字节之前)是用于将国际货币符号与货币数量分开的字符。

正如你所看到的,它应该包含你得到的东西。

关于你的第二种方法:

  
    

此外,nl_langinfo(CRNCYSTR)也返回符号和符号,而只返回所需的符号。 “ - £” - > “£”

  

这是因为符号定义符号是放在值(+)之前,值( - )之后,还是应该替换基数字符(。)。这来自langinfo.h的POSIX规范:

  

本地货币符号,如果符号应出现在值之前,则以“ - ”开头,如果符号应出现在值之后,则加上“+”,或“。”如果符号应替换基数字符。如果本地货币符号是空字符串,则实现可以返回空字符串(“”)。

至于获取字符串部分的方法,我建议在调用后立即将返回值中的相关部分复制到您自己的缓冲区中。你必须这样做,因为任何一个函数返回的结构和各种指针都是由C库分配和维护的。

POSIX给出的nl_langinfo()返回值的原因是:

  

应用程序不得修改返回的字符串。 nl_langinfo()返回的指针可能无效,或者后续调用任何线程中的nl_langinfo()或同一线程或初始线程中的nl_langinfo_l(),后续调用setlocale()与项目类别(参见)或类别LC_ALL相对应的类别,或后续调用uselocale()的类别,该类别更改与项目类别对应的类别。 nl_langinfo_l()返回的指针可能无效,或者字符串内容可能被后续调用同一线程中的nl_langinfo_l()或任何线程中的nl_langinfo()或后续调用freelocale()或newlocale()所覆盖它释放或修改传递给nl_langinfo_l()的语言环境对象。

以下是localeconv()给出的类似理由:

  

localeconv()函数应返回一个指向填充对象的指针。应用程序不应修改返回值指向的结构,也不应修改结构中指针指向的任何存储区域。返回的指针和结构中的指针可能无效,或者后续调用localeconv()可能会覆盖结构或存储区域。此外,返回的指针和结构中的指针可能无效,或者后续使用类别LC_ALL,LC_MONETARY或LC_NUMERIC调用setlocale()或通过调用uselocale()来覆盖结构或存储区域它改变了类别LC_MONETARY或LC_NUMERIC。