如何检查语言环境是否为 UTF-8?
How to check if a locale is UTF-8?
我正在使用 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" 文件,结果是:
Hc�������������cEnglish locale for the USAFree Software
Foundation,
Inc.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:2000UTF-8
在文件的末尾有一些回忆"UTF-8"。这足以假设编码是 UTF-8 吗?
如何检查语言环境是否为 UTF-8?
LC_IDENTIFICATION
没告诉你太多:
LC_IDENTIFICATION - this is not a user-visible category, it contains information about the locale itself and is rarely useful for users or developers (but is listed here for completeness sake).
您必须查看完整的文件集。
似乎没有用于执行此操作的标准命令行实用程序,但有一个运行时调用(比原始语言环境函数晚一点添加)。这是一个示例程序,它说明了函数 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
有一个 different 选项 -u
标识代码集,但是 locale
(在标准中)没有提到显示方法此信息。
像往常一样,实现可能(或可能不会)以不同的方式处理未指定的功能。 GNU C 库的文档在某些方面与标准不同(参见 locale
and localedef
),但没有提供显示代码集名称的明确选项。
我正在使用 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" 文件,结果是:
Hc�������������cEnglish locale for the USAFree Software Foundation, Inc.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:2000UTF-8
在文件的末尾有一些回忆"UTF-8"。这足以假设编码是 UTF-8 吗?
如何检查语言环境是否为 UTF-8?
LC_IDENTIFICATION
没告诉你太多:
LC_IDENTIFICATION - this is not a user-visible category, it contains information about the locale itself and is rarely useful for users or developers (but is listed here for completeness sake).
您必须查看完整的文件集。
似乎没有用于执行此操作的标准命令行实用程序,但有一个运行时调用(比原始语言环境函数晚一点添加)。这是一个示例程序,它说明了函数 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
有一个 different 选项-u
标识代码集,但是locale
(在标准中)没有提到显示方法此信息。
像往常一样,实现可能(或可能不会)以不同的方式处理未指定的功能。 GNU C 库的文档在某些方面与标准不同(参见 locale
and localedef
),但没有提供显示代码集名称的明确选项。