如何修復 openSUSE Linux 中的 UTF-8 / 語言環境問題(在終端 / 文件名和程序對話中)
我有一些不是 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
.