我正在与Yocto一起为ARM设备(i.MX 6Quad处理器)创建嵌入式linux发行版。

我已经使用变量配置了所需语言环境的列表:

IMAGE_LINGUAS = "de-de fr-fr en-gb en-gb.iso-8859-1 en-us en-us.iso-8859-1 zh-cn"

结果,我获得了一个包含以下文件夹的文件系统:
root@lam_icu:/usr/lib/locale# cd /usr/share/locale/
root@lam_icu:/usr/share/locale# ls -la
total 0
drwxr-xr-x  6 root root  416 Nov 17  2016 .
drwxr-xr-x 30 root root 2056 Nov 17  2016 ..
drwxr-xr-x  4 root root  296 Nov 17  2016 de
drwxr-xr-x  3 root root  232 Nov 17  2016 en_GB
drwxr-xr-x  4 root root  296 Nov 17  2016 fr
drwxr-xr-x  4 root root  296 Nov 17  2016 zh_CN

和:
root@lam_icu:/usr/share/locale# cd /usr/lib/locale/
root@lam_icu:/usr/lib/locale# ls -la
total 0
drwxr-xr-x  9 root root   640 Mar 13  2017 .
drwxr-xr-x 32 root root 40000 Mar 13  2017 ..
drwxr-xr-x  3 root root  1016 Mar 13  2017 de_DE
drwxr-xr-x  3 root root  1016 Mar 13  2017 en_GB
drwxr-xr-x  3 root root  1016 Mar 13  2017 en_GB.ISO-8859-1
drwxr-xr-x  3 root root  1016 Mar 13  2017 en_US
drwxr-xr-x  3 root root  1016 Mar 13  2017 en_US.ISO-8859-1
drwxr-xr-x  3 root root  1016 Mar 13  2017 fr_FR
drwxr-xr-x  3 root root  1016 Mar 13  2017 zh_CN

所有非ISO-8859-1语言环境的编码是什么?我可以假定“en_GB”或“en_US”使用UTF-8编码吗?

我试图打开“LC_IDENTIFICATION”文件,结果是:



在文件末尾,有一些东西可以回想起“UTF-8”。这足以假设编码为UTF-8吗?

如何检查语言环境是否为UTF-8?

最佳答案

LC_IDENTIFICATION 不会告诉您太多信息:



您必须查看完整的文件集。

似乎没有标准的命令行实用程序来执行此操作,但是有一个运行时调用(添加到原始语言环境功能的后面)。这是一个示例程序,说明了nl_langinfo函数:

#include <stdio.h>
#include <locale.h>
#include <langinfo.h>

int
main(int argc, char **argv)
{
    int n;
    for (n = 1; n < argc; ++n) {
        if (setlocale(LC_ALL, argv[n]) != 0) {

            char *code = nl_langinfo(CODESET);
            if (code != 0)
                printf("%s ->%s\n", argv[n], code);
            else
                printf("?%s (nl_langinfo)\n", argv[n]);
        } else {
            printf("? %s (setlocale)\n", argv[n]);
        }
    }
    return 0;
}

和一些输出,例如foo $(locale -a):
aa_DJ ->ISO-8859-1
aa_DJ.iso88591 ->ISO-8859-1
aa_DJ.utf8 ->UTF-8
aa_ER ->UTF-8
aa_ER@saaho ->UTF-8
aa_ER.utf8 ->UTF-8
aa_ER.utf8@saaho ->UTF-8
aa_ET ->UTF-8
aa_ET.utf8 ->UTF-8
af_ZA ->ISO-8859-1
af_ZA.iso88591 ->ISO-8859-1
af_ZA.utf8 ->UTF-8
am_ET ->UTF-8
am_ET.utf8 ->UTF-8
an_ES ->ISO-8859-15
an_ES.iso885915 ->ISO-8859-15
an_ES.utf8 ->UTF-8
ar_AE ->ISO-8859-6
ar_AE.iso88596 ->ISO-8859-6
ar_AE.utf8 ->UTF-8
ar_BH ->ISO-8859-6
ar_BH.iso88596 ->ISO-8859-6

您引用的目录名称通常(但不是必需)与编码名称相同。这是示例程序中所做的假设。 How to get terminal's Character Encoding中存在一个相关问题,但没有有用的答案。一个有趣的是,因为它断言
locale charmap

将给出语言环境编码。根据标准,不一定如此:
  • 命令 locale charmap 给出localedef -f中使用的名称
  • 但是, localedef -f选项中给定的名称没有特殊含义。
  • localedef具有一个不同的选项-u,它标识代码集,但是locale(在标准中)没有提及用于显示此信息的方法。

  • 与往常一样,实现可以(也可以不)以不同的方式对待未指定的功能。 GNU C库的文档在某些方面与标准有所不同(请参阅 locale localedef ),但是没有提供用于显示代码集名称的明确选项。

    关于linux - 如何检查语言环境是否为UTF-8?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42784435/

    10-13 05:08