secureCRT linux shell顯示中文亂碼 解決方法


引:有沒有這樣的經歷:

1、在shell中直接查看包含中文的文件時,出現一堆火星文,不得不下載下來window看.

 

2、無法正常的在shell中輸入中文。

 

3、make的時候輸出一堆亂碼。

 

以下是查閱各種網上包括公司內部KM得到的一些資料,通過下面的一些步驟應該就會被這些火星文困擾了。

 

第一步:嘗試修改SecureCRT上的顯示配置:

 

km上有這樣一則帖子廣為流傳:

 

SecureCRT的默認配置對中文支持不好。很容易出現中文亂碼。即使顯示出來沒有亂碼,將文本復制粘貼到其他windows程序中也會是亂碼,或者從windows復制進SecureCRT會亂碼,很不方便。這個歸結起來還是字符編碼的問題,需要進行以下簡單設置:

 

1. 首先進入 Option 菜單 >> Session Option 
2. Terminal >> Emulation,在右邊 Terminal下拉菜單中選擇"Linux", "ANSI Color"前面打上勾。
3. Terminal >> Appearance
3.1 點右邊的Font 按鈕, 1) 選擇新宋體,2) 字符集選"中文 GB2312"
3.2 Charactor 下拉菜單中選擇 "Default", 去掉"Use Unicode line drawing character"前面的勾。
保存設置,重啟SecureCRT,進入剛才配置的Session,終於可以跟煩人的亂碼說BYEBYE

 

帖子下面有人回復說顯示出來的文字還是很奇怪,估計就是火星文了。。。應該是該方法還不能奏效!不過點擊的人還是很多,看來遇到這個問題的人不少呵!

 

 

 

第二步:嘗試修改shell的語言環境變量

 

2.1 語言環境是啥東東

 

    說白了,語言環境就是locale,locale就是shell運行時的語言環境, 它包括語言(Language), 地域 (Territory) 和字符集(Codeset),一般用以下變量進行綜合述:

 

1、語言符號及其分類(LC_CTYPE) 

 

2、數字(LC_NUMERIC) 

 

3、比較和排序習慣(LC_COLLATE) 

 

4、時間顯示格式(LC_TIME) 

 

5、貨幣單位(LC_MONETARY) 

 

6、信息主要是提示信息,錯誤信息,狀態信息,標題,標簽,按鈕和菜單等(LC_MESSAGES) 

 

7、姓名書寫方式(LC_NAME) 

 

8、地址書寫方式(LC_ADDRESS) 

 

9、電話號碼書寫方式(LC_TELEPHONE) 

 

10、度量衡表達方式 (LC_MEASUREMENT) 

 

11、默認紙張尺寸大小(LC_PAPER) 

 

12、對locale自身包含信息的概述(LC_IDENTIFICATION)。

 

以下是幾台機器的locale的結果:

 

game@developer_6_224_172:/data/ranklog/forestrisk> locale

 

LANG=zh_CN.GB2312

 

LC_CTYPE="zh_CN.GB2312"

 

LC_NUMERIC="zh_CN.GB2312"

 

LC_TIME="zh_CN.GB2312"

 

LC_COLLATE="zh_CN.GB2312"

 

LC_MONETARY="zh_CN.GB2312"

 

LC_MESSAGES="zh_CN.GB2312"

 

LC_PAPER="zh_CN.GB2312"

 

LC_NAME="zh_CN.GB2312"

 

LC_ADDRESS="zh_CN.GB2312"

 

LC_TELEPHONE="zh_CN.GB2312"

 

LC_MEASUREMENT="zh_CN.GB2312"

 

LC_IDENTIFICATION="zh_CN.GB2312"

 

LC_ALL=zh_CN.GB2312

 

-------------------------------------------172可以顯示中文

 

developer_27_181_88:/data/ranklog/forestrisk # locale    

 

LANG=en_US.ISO-8859-1

 

LC_CTYPE=en_US

 

LC_NUMERIC="en_US.ISO-8859-1"

 

LC_TIME="en_US.ISO-8859-1"

 

LC_COLLATE="en_US.ISO-8859-1"

 

LC_MONETARY="en_US.ISO-8859-1"

 

LC_MESSAGES="en_US.ISO-8859-1"

 

LC_PAPER="en_US.ISO-8859-1"

 

LC_NAME="en_US.ISO-8859-1"

 

LC_ADDRESS="en_US.ISO-8859-1"

 

LC_TELEPHONE="en_US.ISO-8859-1"

 

LC_MEASUREMENT="en_US.ISO-8859-1"

 

LC_IDENTIFICATION="en_US.ISO-8859-1"

 

LC_ALL=

 

-----------------------------------------------可以顯示中文

 

game@developer_6_224_41:/data> locale

 

LANG=en_US.UTF-8

 

LC_CTYPE="en_US.UTF-8"

 

LC_NUMERIC="en_US.UTF-8"

 

LC_TIME="en_US.UTF-8"

 

LC_COLLATE="en_US.UTF-8"

 

LC_MONETARY="en_US.UTF-8"

 

LC_MESSAGES="en_US.UTF-8"

 

LC_PAPER="en_US.UTF-8"

 

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=

 

----------------------------------------------不能顯示中文,也就是中文變成火星文???

 

zh_CN.GB2312到底是在說什么? 

 

一個locale的書寫格式為: 語言[_地域[.字符集]]。所以說呢,locale總是和一定的字符集相聯系的。

 

1、我說中文,身處中華人民共和國,使用國標2312字符集來表達字符。zh_CN.GB2312=中文_中華人民共和國+國標2312字符集。 

 

2、我說英文,身處大不列顛,使用ISO-8859-1字符集來表達字符。 en_GB.ISO-8859-1=英文_大不列顛.ISO-8859-1字符集

 

設定locale就是設定12大類的locale分類屬性,即12個LC_*。除了這12個變量可以設定以外,為了簡便起見,還有兩個變量:LC_ALL和LANG。它們之間有一個優先級的關系:LC_ALL > LC_* >LANG。可以這么說,LC_ALL是最上級設定或者強制設定,而LANG是默認設定值。 
1、如果你設定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG設定成什么值,它們都會被強制服從LC_ALL的設定,成為 zh_CN.UTF-8。 
2、假如你設定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,並且沒有設定LC_ALL的話,那么系統的locale設定以LC_*=en_US.UTF-8。 
3、假如你設定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未設定的話,系統會將LC_*設定成默認值,也就是LANG的值zh_CN.UTF-8。 
4、假如你設定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未設定的話,那么系統的locale設定將是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均會采用默認值,也就是 LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。 

 

2.2怎么設置locale?

 

其實設置locale很簡單,直接在shell中敲入:

 

export LC_ALL="zh_CN.GBK"

 

export LANG="zh_CN.GBK"

 

兩個命令就搞定了,但是,我關了shell,下次又開起來的時候又顯示火星文了。。。

 

2.3linux環境變量生存周期及設置方法

 

按變量的生存周期來划分,Linux變量可分為兩類:

 

1、臨時的使用export命令聲明即可,變量在關閉shell時失效直接運行export命令定義變量「只對當前shell(BASH)有效(臨時的)」

 

   在shell的命令行下直接使用[export 變量名=變量值] 定義變量,該變量只在當前的shell(BASH)或其子shell(BASH)下是有效的,shell關閉了,變量也就失效了,再打開新shell時就沒有了。

 

2永久的需要修改配置文件,變量永久生效。

 

針對所有用戶的方案.

 

    在/etc/profile文件中添加變量「對所有用戶生效(永久的)」

 

  用VI在文件/etc/profile文件中增加變量,該變量將會對Linux下所有用戶有效,並且是“永久的”。

 

  例如:編輯/etc/profile文件,添加 LC_ALL ,LANG變量

 

    echo "export LC_ALL=zh_CN.GB2312">>/etc/profile

 

     echo "export LANG=zh_CN.GB2312">>/etc/profile

 

  注:以root身份修改,修改文件后要想馬上生效還要運行# source /etc/profile不然只能在下次重進此用戶時生效。

 

針對某個用戶的方案.

 

    在用戶目錄下的。bash_profile文件中增加變量「對單一用戶生效(永久的)」

 

  用VI在用戶目錄下的。bash_profile文件中增加變量,改變量僅會對當前用戶有效,並且是“永久的”。

 

  例如:編輯xx用戶目錄(/home/xx)下的.bash_profile文件,這個文件可能不存在的。

 

  vi /home/xx/.bash_profile

 

  添加如下內容:

 

  export LC_ALL=zh_CN.GB2312

 

    export LANG=zh_CN.GB2312

 

    最后 $ source /home/xx/.bash_profile

 

第三步:搞定XML顯示中文亂碼

 

本以為神馬都可以顯示為中文了,最后還是發現一些設定utf-8編碼格式的xml等文件顯示火星文:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

 

查了下網上的材料,用以下方法搞定之:

 

1、vi的時候敲入命令:

 

set encoding=utf-8 termencoding=gbk

 

set fileencodings=gbk,utf-8

 

2、設置到vim的配置文件中,注,該配置文件不一定存在,每個用戶一個配置,配置只對該用戶生效

 

echo "set termencoding=gbk" >> ~/.vimrc

 

echo "set encoding=utf-8">>~/.vimrc

 

echo "set fileencoding=utf-8">>~/.vimrc

 

-------------------------------------終極配置腳本-------------------------------------

總結以上,為方便使用,用腳本setzhlang.sh +x root執行就可以解決亂碼問題了,就可以和煩人的火星文說( ^_^ )/~~拜拜啦!

Setzhlang.sh 

 

!/bin/bash

 

echo "export LC_ALL=zh_CN.GB2312">>/etc/profile
echo "export LANG=zh_CN.GB2312">>/etc/profile

 

source '/etc/profile' 

 

echo "set termencoding=gbk" >> ~/.vimrc

 

echo "set encoding=utf-8">>~/.vimrc

 

echo "set fileencoding=utf-8">>~/.vimrc

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM