首頁 >php教程 >PHP开发 >linux下文件中文亂碼的一些情況

linux下文件中文亂碼的一些情況

高洛峰
高洛峰原創
2016-12-15 16:28:491575瀏覽

    其實亂碼這個問題是由系統集成的字符集引起的,由於不能正確的使用相對應字符的字符集,因此OS不能識別出文字導致了亂碼,解決的方法不難...... 

首先,我們先要知道控制Linux OS 的語言環境變數是 $LANG和$LC_ALL,要解決亂碼的情況我們只需要把上述的兩個變數正確設定即可. 

亂碼分兩種情況: 
1.終端(純shell介面)的亂碼 
vi /etc/profile 
export LC_ALL="zh_CN.GB18030:zh_CN.GB2312:zh_CN.GBK:zh_CN:en_US.UTF-8:en_US:enzh_CN.GBK:zh_CN:en_US.UTF-8:en_US:en:zh; " 
保存退出,reboot系統即可.. 

2.X-window(圖形介面)的亂碼 
vi /etc/sysconfig/i18n 
LANG="zh_CN.GB18030:zh_CN en_US.UTF-8:en_US:en:zh:zh_TW:zh_CN.BIG5" 
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN.GBK:zh_CN:en_USh_CN.GB2312:zh_CN.GBK:zh_CN:en_US.UTF-8:en_US. zh_CN.BIG5" 
保存reboot即可... 

由於中文的字符集編碼很多,我自己也不是十分清楚彼此的兼容性如何,所以就盡可能的找了很多種不同的編碼都寫了上去,大家也可以自己篩選下,總的解決思路就是修改控制環境參數的變數,增加OS所支援的字元集(前提要內核上存在該字元,否則需要編譯內核)...


正在開發的WEB系統是部署在RED   HEAD 。
RH版本資訊: 
LSB   Version:         :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics-  ID:   RedHatEnterpriseServer
Description:         Red   Hat   Enterprise   Linux   Server   release       5 
Codename:               Tikanga 
---------------------------- --- 
locale   資訊 
LANG=zh_CN.UTF-8 
LC_CTYPE="zh_CN.UTF-8" 
LC_NUMERIC="zh_CN.UTF-8" 

. UTF-8" 
LC_MONETARY="zh_CN.UTF-8" 
LC_MESSAGES="zh_CN.UTF-8" 
LC_PAPER="zh_CN.UTF-8" 
素_NAME="zhDR_CN_ND.88FP. UTF-8" 
LC_TELEPHONE="zh_CN.UTF-8" 
LC_MEASUREMENT="zh_CN.UTF-8" 
LC_IDENTIFICATION="zh_CN.UTF-8" 
LC_ALL= --------------------- 
因為程式目錄有若干檔案要唸出來顯示在頁面上,檔案名稱為中文名稱 
我使用File.list()方法得到了檔名列表,可是顯示出來的都是亂碼。
new   String(filename.getBytes("utf-8"),"GBK"); 
new   String(filename.getBytes("iso-8859-1"),"GBK");get 
new ),GBK"); 

都不起作用, 
使用 System.getProperty("file.encoding") 得出的是"utf-8" 
另外,使用   ls   命令查看的時候,是亂碼,使用  -show-control-chars   指令就能顯示中文名(控制台)




添加 locale, 估計你的系統不支援gbk字符集。 /local 

加完後 locale-gen一下, 重新刷新字符集快取。文件格式是GBK(gb2312),而Linux一般都是UTF-8。文件編碼可以透過以下幾種方式:
1.在Vim中可以直接查看文件編碼
:set fileencoding
即可顯示文件編碼格式。亂碼的問題,那麼你可以在
~/.vimrc 檔案中加入以下內容:
set encoding=utf-8
fileencodings=ucs-bom,utf-8,cp936
這樣,就可以讓vim自動辨識檔案編碼(可以自動辨識UTF-8或GBK編碼的檔案),其實就是依照 fileencodings提供的編碼清單嘗試,如果沒有找到適當的編碼,就用latin-1(ASCII)編碼打開。
2. enca (如果你的系統中沒有安裝這個指令,可以用sudo yum install -y enca 安裝 )查看檔案編碼
$ enca filename
filename: Universalcpp元LF說明一點的是,enca對某些GBK編碼的文件識別的不是很好,識別時會出現:
Unrecognized encoding
二,文件編碼轉換
1.在Vim中直接進行轉換文件編碼,比如將一個文件轉換成utf-8格式
:set fileencoding=utf-8
2. iconv 轉換,iconv的命令格式如下:
iconv -f encoding -t encoding inputfile
例如將一個UTF-8K -f GBK -t UTF-8 file1 -o file2
3. enconv 轉換檔案編碼
例如將GBK編碼的檔案轉換為UTF-8編碼,操作如下
enconv -L zh_CN ,文件名編碼轉換:
從Linux往 windows拷貝文件或從windows往Linux拷貝文件,有時會出現中文文件名亂碼的情況,出現這種問題的原因是因為,windows的文件名中文編碼默認為GBK,而Linux中預設檔名編碼為UTF8,由於編碼不一致,所以導致了檔名亂碼的問題,解決這個問題需要對檔名進行轉碼。
在Linux中特別提供了一種工具convmv進行檔案名稱編碼的轉換,可以將檔案名稱從GBK轉換成UTF-8編碼,或從UTF-8轉換到GBK。
先看一下你的系統上是否安裝了convmv,如果沒安裝的話用:
yum -y install convmv 安裝。

下面看一下convmv的具體用法:
convmv -f 來源編碼 -t 新編碼 [選項] 檔案名稱
常用參數:
-r 遞歸處理子資料夾
–notest 真正進行參數:
-r 遞歸處理子資料夾
–notest 真正進行操作,請注意預設操作是不對文件進行真實操作的,而只是試驗。
–list 顯示所有支援的編碼
–unescap 可以做一下轉義,例如把%20變成空格

例如我們有一個utf8編碼的檔名,轉換成GBK編碼,指令如下:
convmv -f UTF- 8 -t GBK –notest utf8編碼的檔案名稱
這樣轉換以後」utf8編碼的檔案名稱」會轉換成GBK編碼(只是檔案名稱編碼的轉換,檔案內容不會改變)


四,vim 編碼方式的設定
和所有的流行文字編輯器一樣,Vim 可以很好的編輯各種字元編碼的文件,這當然包括UCS-2、UTF-8 等流行的Unicode 編碼方式。然而不幸的是,和許多來自 Linux 世界的軟體一樣,這需要你自己動手設定。
Vim 有四個跟字符編碼方式有關的選項,encoding、fileencoding、fileencodings、termencoding (這些選項可能的取值請參考 Vim 在線幫助 :help encoding-names),它們的意義如下:
* 使用的字元編碼方式,包括 Vim 的 buffer (緩衝區)、選單文字、訊息文字等。預設是根據你的locale選擇.用戶手冊上建議只在 .vimrc 中改變它的值,事實上似乎也只有在.vimrc 中改變它的值才有意義。你可以用另外一種編碼來編輯和保存文件,如你的vim的encoding為utf-8,所編輯的文件採用cp936編碼,vim會自動將讀入的文件轉成utf-8(vim的能讀懂的方式),而當你寫入文件時,又會自動轉回成cp936(文件的保存編碼).
* fileencoding: Vim 中當前編輯的文件的字符編碼方式,Vim 保存文件時也會將文件儲存為這種字元編碼方式 (不管是否新檔案都如此)。
* fileencodings: Vim自動偵測fileencoding的順序列表,啟動時會依照它所列出的字元編碼方式逐一偵測即將開啟的檔案的字元編碼方式,並且將 fileencoding 設定為最終偵測到的字元編碼方式。因此最好將Unicode 編碼方式放到這個清單的最前面,將拉丁文系編碼方式 latin1 放到最後面。
* termencoding: Vim 所工作的終端 (或 Windows 的 Console 視窗) 的字元編碼方式。如果vim所在的term與vim編碼相同,則無需設定。如其不然,你可以用vim的termencoding選項將自動轉換成term 的編碼.這個選項在 Windows 下對我們常用的 GUI 模式的 gVim 無效,而對 Console 模式的Vim 而言就是 Windows 控制台的程式碼,而對 Console 模式的Vim 而言則是 Windows 控制台的程式碼頁,並且Windows 控制台的程式碼通常我們不需要改變它。


五,Vim 的多重字元編碼工作方式
1. Vim 啟動,根據 .vimrc 中設定的 encoding 的值來設定 buffer、選單文字、訊息的字元編碼方式。

2. 讀取需要編輯的文件,根據 fileencodings 中列出的字元編碼方式逐一探測該文件編碼方式。並設定 fileencoding 為偵測到的,看起來是正確的 (註1) 字元編碼方式。

3. 對比 fileencoding 和 encoding 的值,若不同則調用 iconv 將文件內容轉換為encoding 所描述的字符編碼方式,並且把轉換後的內容放到為此文件開闢的 buffer 裡,此時我們就可以開始編輯這個文件了。注意,完成這一步動作需要呼叫外部的 iconv.dll(註2),你需要確保這個文件存在於 $VIMRUNTIME 或其他列在 PATH 環境變數中的目錄裡。

4. 編輯完成後儲存檔案時,再比較 fileencoding 和 encoding 的數值。若不同,再次呼叫 iconv 將即將儲存的 buffer 中的文字轉換為 fileencoding 所描述的字元編碼方式,並儲存到指定的檔案中。同樣,這需要調用 iconv.dll由於 Unicode 能夠包含幾乎所有的語言的字符,而且 Unicode 的 UTF-8 編碼方式又是非常具有性價比的編碼方式 (空間消耗比 UCS-2 小),因此建議的值設定為utf-8。這麼做的另一個理由是 encoding 設定為 utf-8 時,Vim 自動偵測檔案的編碼方式會更準確 (或許這個理由才是主要的  。我們在中文 Windows 裡編輯的文件,為了兼顧與其他軟體的相容性,檔案編碼還是設定為 GB2312/GBK 比較合適,因此 fileencoding 建議設定為 GB2312/GBK 較為合適,因此 fileencoding 建議設定為 chinese (chinese 是個別名,在 Unix 裡表示 gb2312,在 Windows 裡表示cp936,也就是 GBK頁)。

更多linux下文件中文亂碼的一些情況相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn