最精簡有效的 glibc locales 設定

2021-09-05 13:54:17 字數 3204 閱讀 1505

最精簡有效的 glibc locales 設定

by erichsu

- begin.200412211044

經過昨天一天實驗, 把 glibc 重灌了 4 次, 得出如下獲得最精簡 glibc locales 設定的方法 (下面是步驟, 沒耐心了解其原因的朋友直接照做就可以, 有興趣問個為什麼的, 我會在步驟後面給出詳細解釋. 另, 條件所限, 僅針對簡體中文使用者):

一. 步驟

確保 emerge glibc 時, useflags 中有 userlocales

要讓 glibc 在 emerge 時僅生成我們所需的 locales, 那麼必須設定 userlocales useflag:

code:

# echo "sys-libs/glibc userlocales" >> /etc/portage/package.use

emerge -pv glibc 時應看到:

quote:

[ebuild r ] sys-libs/glibc-2.3.4.20041102 -build -debug -erandom -hardened -multilib +nls -nomalloccheck +nptl +nptlonly -pic +userlocales 0 kb

編輯 /etc/locales.build, 僅設定如下 5 行, 其餘一律注釋掉:

code:

en_us/iso-8859-1

en_us.utf-8/utf-8

zh_cn/gb18030

zh_cn.gb2312/gb2312

zh_cn.utf-8/utf-8

安裝 glibc

code:

# emerge --oneshot glibc

設定系統的 lc_all 為 zh_cn

編輯 /etc/env.d/99local, 如果沒有這個檔案就自己建立, 新增一行:

code:

lc_all=zh_cn

然後執行:

code:

# env-update

登出, 重新登入, gb18030 字符集裡的中文字都應該能正常顯示, 測試:

讓僅支援 gb2312/utf8 的程式正常工作

二. 解釋

只有在 useflags 中設定了 userlocales 後, /etc/locales.build 這個檔案才會起作用, 否則, emerge glibc 預設將生成所有 locales

/etc/locales.build 的解釋:

quote:

# 必不可少的英文支援

en_us/iso-8859-1

en_us.utf-8/utf-8

# lc_all=zh_cn, 則系統將使用 zh_cn 下的所有字元資訊/內容, 因此我們使用 gb18030 碼表 (charmap) 以最大限度覆蓋所有中文字元

zh_cn/gb18030

# 為有些僅支援 gb2312 的程式提供選擇

zh_cn.gb2312/gb2312

# 為有些僅支援 utf8 的程式提供選擇

zh_cn.utf-8/utf-8

對於 /etc/locales.build 的格式 (每一行為 /) 有時會讓人迷惑, 比如會看到 de_de@euro/iso-8859-15 這樣的, 又會看到 en_us.utf-8/utf-8... 我當時就一直不理解為什麼會有個 "@" 符號? 什麼時候該用 "."? 其實很簡單,

經過實驗發現, 每個 locale 項會在 /usr/lib/locale 下生成乙個同名的目錄, 例如, 如上配置, 我們將在 /usr/lib/locale 下得到如下目錄:

code:

eric@gentux ~ $  ls /usr/lib/locale/

en_us  en_us.utf8  ru_ru  zh_cn  zh_cn.gb2312  zh_cn.utf8

(注, ru_ru 裡面的內容為空, 我刪掉過, 但是 emerge glibc 時又會生成, 忽略之)

每個目錄恰好與 /etc/locales.build 中的 locales 一一對應.

為何要設定 lc_all=zh_cn?

其實最新的一些程式大都支援 locales 如 zh_cn.gbk, zh_cn.gb18030, zh_cn.utf-8, 但是, 有些程式還是僅支援到 gb2312, 它們在 gbk, gb18030, utf-8 下會運作不正常. 例如, 瀏覽器的 flash 外掛程式的僅在 lc_all=zh_cn 的情況下, 其右鍵選單才能正常顯示中文, 在 lc_all=zh_cn.gbk 下, 右鍵選單空白. 總之, 通過 lc_all=zh_cn 設定系統的 locale 為 zh_cn 將最大限度讓新老程式的中文都運作正常. 而又因為 /usr/lib/locale/zh_cn 下的 lc_* 檔案的內容都是使用 /usr/share/i18n/charmaps 裡的 gb18030.gz 這一目前最全 (?) 的中文碼表來生成的, 因此, 這又讓所有程式覆蓋了最全 (?) 的中文字元, 系統將可以正常處理 gb18030 字符集範圍以內的所有中文字元 (當然, 還是有限制, 有些生僻的中文字元還是顯示成方塊, 那是因為字型檔案本身的限制造成的, 如果我沒記錯的話, simsun 僅支援到 gbk 字符集, 不過已經絕對夠用了. 如果還非要顯示所有字元, 那就設法找個支援 gb18030 字符集的字型吧, 好像有個 simsun-18030).

三. 實驗記錄

實驗前, glibc 是安裝系統是裝的, 當時沒有設定 userlocales 這一 useflags, 因此 glibc 安裝過程中生成了所有的 locales.

第一次:

echo $lc_all

code:

zh_cn

locale -a

code:

c en_us

en_us.utf8

posix

zh_cn

zh_cn.utf8

ls /usr/lib/locale

code:

en_us  en_us.utf8  ru_ru  zh_cn  zh_cn.utf8

問題:

第二次:

第三次:

第四次:

最精簡的IOCP封裝

最精簡的iocp封裝,delphi xe8直接編譯通過。winsock2.pas即使用delphi自帶的,相信xe7也能編譯,或者xe6,xe5也能。單說winsock2.pas,我見過無數種版本的了,各版本winsock 2的api的方法的引數的資料型別居然都有出入,使用不同人封裝的winsock...

最精簡的小寫金額轉大寫的函式

function changdx2 mmje double string const s1 string 零壹貳叄肆伍陸柒捌玖 s2 string 分角元拾佰仟萬拾佰仟億拾佰仟萬 function strtran const s,s1,s2 string string begin result st...

史上最精簡的9個雲計算的問答

什麼是雲計算?拿水舉例。雲計算就是自來水,家庭不用挖井 不用抽水機 不用水塔。開啟水龍頭就出水,要多要少自己控制。而對應的傳統it裝置,就需要先購買 然後安裝 自己負責各種問題。換句話說,雲計算就是從買 計算機 變成買 計算能力 減少成本支出,並提公升了效率。書面來解釋,雲計算是利用技術來實現計算資...