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

我正在与Yocto合作为ARM设备(i.MX 6Quad Processors)创buildembedded式Linux发行版。

我已经用variablesconfiguration了所需语言环境的列表:

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”文件,结果是:

美国免费软件基金会的英文语言环境http://www.gnu.org/software/libc/bug-glibc-locales@gnu.orgEnglishUSA1.02000- 06-24en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000en_US:2000 UTF-8

在文件的最后有一些回忆“UTF-8”的东西。 这足以假设编码是UTF-8?

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

LC_IDENTIFICATION并没有告诉你很多:

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 

您所指的目录名称通常(但不是必需的)与编码名称相同。 这是在示例程序中做出的假设。 如何获取终端的字符编码有一个相关的问题,但没有有用的答案。 一个有趣的,因为它断言

 locale charmap 

将给出语言环境编码。 根据标准,这不一定是这样的:

  • 命令locale charmap给出了在localedef -f使用的名称

  • 但是, localedef-f选项中给出的名称没有特别的含义。

  • localedef有一个不同的选项-u标识代码集,但locale (在标准中)没有提到显示这个信息的方法。

像往常一样,实现可能(或可能不)以不同的方式处理未指定的特征。 GNU C库的文档在某些方面与标准不同(请参阅localelocaledef ),但不提供显示代码集名称的明确选项。