Linux下文件中文亂碼該如何處理
今天扣丁學(xué)堂小編給大家整理一下關(guān)于Linux下文件中文亂碼一般都有哪些情況呢?下面我們一起來(lái)看一下吧,首先實(shí)亂碼這個(gè)問(wèn)題是由系統集成的字符集引起的,由于不能正確的使用相對應字符的字符集,因此OS不能識別出文字導致了亂碼,解決的方法不難......
首先,我們先要知道控制LinuxOS的語(yǔ)言環(huán)境變量是$LANG和$LC_ALL,要解決亂碼的情況我們只需要把上述的兩個(gè)變量正確設置即可。
亂碼分兩種情況:
1、終端(純shell界面)的亂碼
vi/etc/profile
exportLC_ALL="zh_CN.GB18030:zh_CN.GB2312:zh_CN.GBK:zh_CN:en_US.UTF-8:en_US:en:zh:zh_TW:zh_CN.BIG5"
保存退出,reboot系統即可..
2、X-window(圖形界面)的亂碼
vi/etc/sysconfig/i18n
LANG="zh_CN.GB18030:zh_CN.GB2312:zh_CN.GBK: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_US.UTF-8:en_US:en:zh:zh_TW:zh_CN.BIG5"
保存reboot即可...
由于中文的字符集編碼很多,我自己也不是十分清楚彼此的兼容性如何,所以就盡可能的找了很多種不同的編碼都寫(xiě)了上去,大家也可以自己篩選下,總的解決思路就是修改控制環(huán)境參數的變量,增加OS所支持的字符集(前提要內核上存在該字符,否則需要編譯內核)...
正在開(kāi)發(fā)的WEB系統是部署在REDHEAD。
RH版本信息:
LSBVersion::core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics-3.1-ia32:graphics-3.1-noarch
DistributorID:RedHatEnterpriseServer
Description:RedHatEnterpriseLinuxServerrelease5(Tikanga)
Release:5
Codename:Tikanga
-------------------------------
locale信息
.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
---------------------------------
因為程序目錄有若干文件要讀出來(lái)顯示在頁(yè)面上,文件名為中文名
我使用File.list()方法得到了文件名列表,可是顯示出來(lái)的都是亂碼。
newString(filename.getBytes("utf-8"),"GBK");
newString(filename.getBytes("iso-8859-1"),"GBK");
newString(filename.getBytes(),GBK");
都不起作用,
使用System.getProperty("file.encoding")得出的是"utf-8"
另外,使用ls命令查看的時(shí)候,是亂碼,使用ls--show-control-chars命令就能顯示中文名(控制臺)
添加locale,估計你的系統不支持gbk字符集。
ubuntu下是vi/var/lib/locales/supported.d/local
加完后locale-gen一下,重新刷新字符集緩存。
如果你需要在Linux中操作windows下的文件,那么你可能會(huì )經(jīng)常遇到文件編碼轉換的問(wèn)題。Windows中默認的文件格式是GBK(gb2312),而Linux一般都是UTF-8。下面介紹一下,在Linux中如何查看文件的編碼及如何進(jìn)行對文件進(jìn)行編碼轉換。
一、查看文件編碼:
在Linux中查看文件編碼可以通過(guò)以下幾種方式:
1、在Vim中可以直接查看文件編碼
setfileencoding
即可顯示文件編碼格式。
如果你只是想查看其它編碼格式的文件或者想解決用Vim查看文件亂碼的問(wèn)題,那么你可以在
~/.vimrc文件中添加以下內容:
setencoding=utf-8
fileencodings=ucs-bom,utf-8,cp936
這樣,就可以讓vim自動(dòng)識別文件編碼(可以自動(dòng)識別UTF-8或者GBK編碼的文件),其實(shí)就是依照f(shuō)ileencodings提供的編碼列表嘗試,如果沒(méi)有找到合適的編碼,就用latin-1(ASCII)編碼打開(kāi)。
2、enca(如果你的系統中沒(méi)有安裝這個(gè)命令,可以用sudoyuminstall-yenca安裝)查看文件編碼
$encafilename
filename:Universaltransformationformat8bits;UTF-8
CRLFlineterminators
需要說(shuō)明一點(diǎn)的是,enca對某些GBK編碼的文件識別的不是很好,識別時(shí)會(huì )出現:
Unrecognizedencoding
二、文件編碼轉換
1.在Vim中直接進(jìn)行轉換文件編碼,比如將一個(gè)文件轉換成utf-8格式
:setfileencoding=utf-8
2.iconv轉換,iconv的命令格式如下:
iconv-fencoding-tencodinginputfile
比如將一個(gè)UTF-8編碼的文件轉換成GBK編碼
iconv-fGBK-tUTF-8file1-ofile2
3.enconv轉換文件編碼
比如要將一個(gè)GBK編碼的文件轉換成UTF-8編碼,操作如下
enconv-Lzh_CN-xUTF-8filename
三、文件名編碼轉換:
從Linux往windows拷貝文件或者從windows往Linux拷貝文件,有時(shí)會(huì )出現中文文件名亂碼的情況,出現這種問(wèn)題的原因是因為,windows的文件名中文編碼默認為GBK,而Linux中默認文件名編碼為UTF8,由于編碼不一致,所以導致了文件名亂碼的問(wèn)題,解決這個(gè)問(wèn)題需要對文件名進(jìn)行轉碼。
在Linux中專(zhuān)門(mén)提供了一種工具convmv進(jìn)行文件名編碼的轉換,可以將文件名從GBK轉換成UTF-8編碼,或者從UTF-8轉換到GBK。
首先看一下你的系統上是否安裝了convmv,如果沒(méi)安裝的話(huà)用:
yum-yinstallconvmv安裝。
下面看一下convmv的具體用法:
convmv-f源編碼-t新編碼[選項]文件名
常用參數:
-r遞歸處理子文件夾
–notest真正進(jìn)行操作,請注意在默認情況下是不對文件進(jìn)行真實(shí)操作的,而只是試驗。
–list顯示所有支持的編碼
–unescap可以做一下轉義,比如把%20變成空格
比如我們有一個(gè)utf8編碼的文件名,轉換成GBK編碼,命令如下:
convmv-fUTF-8-tGBK–notestutf8編碼的文件名
這樣轉換以后”utf8編碼的文件名”會(huì )被轉換成GBK編碼(只是文件名編碼的轉換,文件內容不會(huì )發(fā)生變化)
四、vim編碼方式的設置
和所有的流行文本編輯器一樣,Vim可以很好的編輯各種字符編碼的文件,這當然包括UCS-2、UTF-8等流行的Unicode編碼方式。然而不幸的是,和很多來(lái)自L(fǎng)inux世界的軟件一樣,這需要你自己動(dòng)手設置。
Vim有四個(gè)跟字符編碼方式有關(guān)的選項,encoding、fileencoding、fileencodings、termencoding(這些選項可能的取值請參考Vim在線(xiàn)幫助:helpencoding-names),它們的意義如下:
*encoding:Vim內部使用的字符編碼方式,包括Vim的buffer(緩沖區)、菜單文本、消息文本等。默認是根據你的locale選擇.用戶(hù)手冊上建議只在.vimrc中改變它的值,事實(shí)上似乎也只有在.vimrc中改變它的值才有意義。你可以用另外一種編碼來(lái)編輯和保存文件,如你的vim的encoding為utf-8,所編輯的文件采用cp936編碼,vim會(huì )自動(dòng)將讀入的文件轉成utf-8(vim的能讀懂的方式),而當你寫(xiě)入文件時(shí),又會(huì )自動(dòng)轉回成cp936(文件的保存編碼).
*fileencoding:Vim中當前編輯的文件的字符編碼方式,Vim保存文件時(shí)也會(huì )將文件保存為這種字符編碼方式(不管是否新文件都如此)。
*fileencodings:Vim自動(dòng)探測fileencoding的順序列表,啟動(dòng)時(shí)會(huì )按照它所列出的字符編碼方式逐一探測即將打開(kāi)的文件的字符編碼方式,并且將fileencoding設置為最終探測到的字符編碼方式。因此最好將Unicode編碼方式放到這個(gè)列表的最前面,將拉丁語(yǔ)系編碼方式latin1放到最后面。
*termencoding:Vim所工作的終端(或者Windows的Console窗口)的字符編碼方式。如果vim所在的term與vim編碼相同,則無(wú)需設置。如其不然,你可以用vim的termencoding選項將自動(dòng)轉換成term的編碼.這個(gè)選項在Windows下對我們常用的GUI模式的gVim無(wú)效,而對Console模式的Vim而言就是Windows控制臺的代碼頁(yè),并且通常我們不需要改變它。
五、Vim的多字符編碼工作方式
1.Vim啟動(dòng),根據.vimrc中設置的encoding的值來(lái)設置buffer、菜單文本、消息文的字符編碼方式。
2.讀取需要編輯的文件,根據fileencodings中列出的字符編碼方式逐一探測該文件編碼方式。并設置fileencoding為探測到的,看起來(lái)是正確的(注1)字符編碼方式。
3.對比f(wàn)ileencoding和encoding的值,若不同則調用iconv將文件內容轉換為encoding所描述的字符編碼方式,并且把轉換后的內容放到為此文件開(kāi)辟的buffer里,此時(shí)我們就可以開(kāi)始編輯這個(gè)文件了。注意,完成這一步動(dòng)作需要調用外部的iconv.dll(注2),你需要保證這個(gè)文件存在于$VIMRUNTIME或者其他列在PATH環(huán)境變量中的目錄里。
4.編輯完成后保存文件時(shí),再次對比f(wàn)ileencoding和encoding的值。若不同,再次調用iconv將即將保存的buffer中的文本轉換為fileencoding所描述的字符編碼方式,并保存到指定的文件中。同樣,這需要調用iconv.dll由于Unicode能夠包含幾乎所有的語(yǔ)言的字符,而且Unicode的UTF-8編碼方式又是非常具有性?xún)r(jià)比的編碼方式(空間消耗比UCS-2小),因此建議encoding的值設置為utf-8。這么做的另一個(gè)理由是encoding設置為utf-8時(shí),Vim自動(dòng)探測文件的編碼方式會(huì )更準確(或許這個(gè)理由才是主要的。我們在中文Windows里編輯的文件,為了兼顧與其他軟件的兼容性,文件編碼還是設置為GB2312/GBK比較合適,因此fileencoding建議設置為chinese(chinese是個(gè)別名,在Unix里表示gb2312,在Windows里表示cp936,也就是GBK的代碼頁(yè))。
以上就是關(guān)于Linux下文件中文亂碼是如何處理的詳細介紹,最后扣丁學(xué)堂的Linux培訓課程從基礎入門(mén)開(kāi)始教,不論學(xué)員是否擁有基礎在扣丁學(xué)堂都能順利的學(xué)習,扣丁學(xué)堂不僅有專(zhuān)業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Linux視頻教程供學(xué)員觀(guān)看學(xué)習,想要學(xué)好Linux開(kāi)發(fā)的小伙伴快快行動(dòng)吧??鄱W(xué)堂PHP技術(shù)交流群:374332265。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。