[英]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 c美國自由軟件基金會的英語語言環境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
),但是沒有提供用於顯示代碼集名稱的顯式選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.