2017-03-14 34 views
1

我正在與Yocto合作爲ARM設備(i.MX 6Quad處理器)創建嵌入式Linux發行版。如何檢查區域設置是否爲UTF-8?

我已經被配置爲與所述可變所需的區域設置的列表:

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

作爲結果我獲得,它包含以下文件夾中的文件系統:

[email protected]_icu:/usr/lib/locale# cd /usr/share/locale/ 
[email protected]_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 

和:

[email protected]_icu:/usr/share/locale# cd /usr/lib/locale/ 
[email protected]_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」 文件,其結果是:

HccEnglish區域爲USAFree軟件 基金會, 公司http://www.gnu.org/software/libc/[email protected]_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?

+0

您可能會檢查[BOM](https://en.wikipedia.org/wiki/Byte_order_mark)。 –

+0

還有[一個庫來檢測編碼](https://www.codeproject.com/articles/17201/detect-encoding-for-in-and-outgoing-text)。 –

回答

2

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 
[email protected] ->UTF-8 
aa_ER.utf8 ->UTF-8 
[email protected] ->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庫的文檔在某些方面與標準不同(請參閱localelocaledef),但不提供顯示代碼集名稱的明確選項。

+0

這是您所建議的程序的輸出:C - > ANSI_X3.4-1968,de_DE - > UTF-8,en_GB - > UTF-8,en_GB.ISO-8859-1 - > ISO-8859-1,en_US - > UTF-8,en_US.ISO-8859-1 - > ISO-8859-1,fr_FR - > UTF-8,POSIX - > ANSI_X3.4-1968,zh_CN - > UTF-8。因此,諸如de_DE或en_GB等語言環境是UTF-8編碼的。甚至「locale charmap」命令也會將UTF-8作爲編碼返回。非常感謝您的回答 – Grynium