你在Windows/MacOS的登錄Linux的SSH終端上很容易輸入中文并且獲得中文輸出,比如下面這樣:

但是卻幾乎不可能將中文顯示在Linux自身的 虛擬終端 上:
[root@localhost font]# echo 皮鞋 >/dev/tty2

顯示了兩個問號,顯然Linux內核并不能識別中文。
為什么說是Linux內核不能識別中文呢?這里需要理清一個關系:
你在遠程SSH終端上的輸入和顯示輸出的行為,都是SSH終端的宿主機完成的,比如Windows,MacOS,和Linux無關。 你在Linux本地虛擬終端,比如/dev/tty1上的輸入和顯示輸出行為,則是由Linux內核自己處理的。比如,我在MacOS用iTerm SSH連接到了一個遠程CentOS Linux,iTerm上的所有的鍵盤輸入,顯示器輸出行為都是iTerm的這臺MacOS宿主機完成的。
相反,如果你直接在這臺CentOS Linux的虛擬終端上輸入并且企圖獲得輸出,那么這個輸入輸出則必須由Linux內核自身來處理。
基本上就這些。至于說為什么Linux內核不支持中文,那要了解Linux內核處理虛擬終端輸入輸出時是如何對待unicode的邏輯,這要涉及一大堆的理論知識,非常煩人。
反正我這里就是無法輸出中文,我也不是做這個的,顯然這不是一個必然要完成的工作任務,所以,我只是玩玩。
本文的目標就是要讓Linux的虛擬終端可以輸出中文。
僅僅是輸出中文,哪怕是一個中文漢字也好。具體來講,就是 當我在鍵盤敲入'A'字符時,顯示器回顯出來的是一個漢字。
所以說,本文并不打算 讓Linux內核大規模完備地支持中文 ,這種事已經有很多人和社區做了,但是可玩性并不高,畢竟這種事是可以當私活兒賺錢的,只要是賺錢的活兒,可玩性就不高,因為要快嘛。
不需要懂冗長枯燥的unicode編碼,不需要懂枯燥的font字體格式,看看怎么玩。
先展示效果吧,下面是一個

不是很好看,于是就做了下面一個

下面說一下這是如何實現的。
從你敲鍵盤的某個按鍵開始,到某個字符最終顯示在虛擬終端的顯示器上,這期間其實有兩個映射:
鍵盤和字符集的映射
將某個按鍵事件轉換為某個字符集里的某個碼,比如當按下'A'鍵時,將其映射到0x41。
字符集和字體的映射
將某個字符集的碼字映射到某個點陣用來顯示。比如將0x41映射到能讓人看出來是一個字符'A'的樣子的
Linux的console并不能識別超過0x00ff的字符集碼字,因此就不能處理碼字超過0x00ff的unicode,如果希望它能做到,這就要改內核代碼了。
剛才說了,修改內核代碼大規模全面支持中文,這是可以賺錢的事,不但沒意思,也沒人會分享。
所以我嘗試去修改上面的兩個映射來解決問題。由于只是顯示,所以我不會去修改
新聞熱點
疑難解答