Opensuse

如何修復 openSUSE Linux 中的 UTF-8 / 語言環境問題(在終端 / 文件名和程序對話中)

  • August 9, 2019

我有一些不是 7 位乾淨的文件/文件夾名稱,它們在我的 openSUSE 系統中沒有正確顯示。

文件夾 /music/Gabriel_Fauré 的範例:

# ls -1d /music/Gabriel_Faur?
/music/Gabriel_Faur??

也許語言環境LC_CTYPE沒有設置為某個 UTF-8 值?

# locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_GB.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_PAPER=a4
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=

LC_CTYPE好吧,我認為這對 Unicode 來說很好!錯誤資訊說什麼?

有趣的是,設置LC_ALL為 的確切值LC_CTYPE將起作用:

# setenv LC_ALL en_US.UTF-8
# ls -1d /music/Gabriel_Faur?
/music/Gabriel_Fauré

但是,我不想將 LC_ALL 設置為 en_US.UTF-8 (或任何東西,真的),因為它會弄亂其他一些設置!這不是解決辦法,但對我來說只是一個糟糕的解決方法。

/bin/ls另外,為什麼在將字元列印到螢幕時,和/或我的外殼會忽略 LC_CTYPE ?

在 Arch Linux 中,我會檢查是否生成了語言環境,但在 openSUSE 中我沒有發現任何關於該主題的內容。此外,語言環境似乎確實存在。

編輯:

# ls -1d /music/Gabriel_Faur? | hexdump -C
00000000  2f 6d 75 73 69 63 2f 47  61 62 72 69 65 6c 5f 46  |/music/Gabriel_F|
00000010  61 75 72 c3 a9 0a                                 |aur...|
00000016

所以它是正確的 UTF-8(據我所知)。

編輯2:

# locale -a | grep en_US
en_US
en_US.iso885915
en_US.utf8
# locale -a | wc -l
495

EDIT3(正確答案後):

# unsetenv LC_PAPER
# unsetenv LC_ALL
# ls -1d /*/Gabriel_Faur?
/music/Gabriel_Fauré

LC_PAPER=a4變數可防止 UTF-8 編碼的 Unicode 字元在螢幕上列印(沒有雙關語) !

該*locale: Cannot set LC_ALL to default locale: No such file or directory*消息告訴您的是,您嘗試使用的語言環境之一不存在。這與$LC_ALL環境變數無關,locale只是在setlocale(LC_ALL, "")基於環境變數初始化本地化的呼叫返回 NULL 時報告錯誤,表明LC_*/LANG無法找到通過各種變數之一配置的語言環境。

在這裡,由於它適用於LC_ALL=en_US.UTF-8覆蓋所有其他的,所以問題必須與LC_PAPER=a4. a4不是系統上有效區域設置的名稱,導致setlocal(LC_ALL, "")失敗。

失敗時setlocale(),行為預設為 C 語言環境,其中字元編碼為 ASCII。在 C 語言環境中,每個字節都是一個字元,但 0xc3 和 0xa9 是未知的,因為它們不是 ASCII,因此ls -q(並且-q在輸出到終端時啟用)將它們呈現為?.

您可以通過以下方式查看系統上可用語言環境的列表:

locale -a

你可能不會a4在那裡找到一個。如果您希望紙張尺寸為 A4,則locale -k LC_PAPER輸出:

height=297
width=210
paper-codeset="UTF-8"

您可能希望對 . 使用歐洲語言環境$LC_PAPER,例如en_GB.UTF-8.

引用自:https://unix.stackexchange.com/questions/534799