我正在与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库的文档在某些方面与标准不同(请参阅locale
和localedef
),但不提供显示代码集名称的明确选项。