示例

下面的程序使用uselocale(3)和duplocale()获取当前语言环境的句柄,然后将该句柄传递给toupper_l(3)。该程序采用一个命令行参数,即一串字符串,这些字符串将转换为大写并显示在标准输出上。其用法示例如下:

$ ./a.out abc
ABC

Program source

#define _XOPEN_SOURCE 700
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)

int
main(int argc, char *argv[])
{
    locale_t loc, nloc;
    char *p;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s string\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    /* This sequence is necessary, because uselocale() might return
       the value LC_GLOBAL_LOCALE, which canaqt be passed as an
       argument to toupper_l() */

    loc = uselocale((locale_t) 0);
    if (loc == (locale_t) 0)
        errExit("uselocale");

    nloc = duplocale(loc);
    if (nloc == (locale_t) 0)
        errExit("duplocale");

    for (p = argv[1]; *p; p++)
        putchar(toupper_l(*p, nloc));

    printf("\n");

    freelocale(nloc);

    exit(EXIT_SUCCESS);
}
DUPLOCALE - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

版本

duplocale()函数首次出现在GNU C库的2.3版中。

另外参见

freelocale(3),newlocale(3),setlocale(3),uselocale(3),locale(5),locale(7)

错误说明

ENOMEM
内存不足,无法创建重复的语言环境对象。

名称

duplocale-复制语言环境对象

返回值

成功后,duplocale()返回新语言环境对象的句柄。发生错误时,它将返回(locale_t)0,并设置errno以指示错误原因。

备注

复制语言环境可以达到以下目的:

*
创建将在其中修改多个类别之一的语言环境对象的副本(使用newlocale(3))。
*
获取当前语言环境的句柄,该句柄可以在其他使用语言环境句柄的函数中使用,例如toupper_l(3)。这是通过将duplocale()应用于以下调用返回的值来完成的:
loc = uselocale((locale_t)0);
此技术是必需的,因为上面的uselocale(3)调用可能返回值LC_GLOBAL_LOCALE,如果将其传递给诸如toupper_l(3)之类的函数,则会导致未定义的行为。调用duplocale()可以确保将LC_GLOBAL_LOCALE值转换为可用的语言环境对象。请参见下面的示例。

duplocale()创建的每个语言环境对象都应使用freelocale(3)进行释放。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

遵循规范

POSIX.1-2008。

语法

#include <locale.h>

locale_t duplocale(locale_t locobj);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

duplocale():

Since glibc 2.10:
_XOPEN_SOURCE>= 700
Before glibc 2.10:
_GNU_SOURCE

说明

duplocale()函数创建由locobj引用的语言环境对象的副本。

如果locobj为LC_GLOBAL_LOCALE,则duplocale()创建一个语言环境对象,该对象包含由setlocale(3)确定的全局语言环境的副本。

日期:2019-08-20 18:00:09 来源:oir作者:oir