博客專(zhuān)欄

        EEPW首頁(yè) > 博客 > Linux下文件中文亂碼該如何處理

        Linux下文件中文亂碼該如何處理

        發(fā)布人:only1 時(shí)間:2020-09-16 來(lái)源:工程師 發(fā)布文章

          今天扣丁學(xué)堂小編給大家整理一下關(guān)于Linux下文件中文亂碼一般都有哪些情況呢?下面我們一起來(lái)看一下吧,首先實(shí)亂碼這個(gè)問(wèn)題是由系統(tǒng)集成的字符集引起的,由于不能正確的使用相對(duì)應(yīng)字符的字符集,因此OS不能識(shí)別出文字導(dǎo)致了亂碼,解決的方法不難......

          首先,我們先要知道控制LinuxOS的語(yǔ)言環(huán)境變量是$LANG和$LC_ALL,要解決亂碼的情況我們只需要把上述的兩個(gè)變量正確設(shè)置即可。


          亂碼分兩種情況:


          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系統(tǒng)即可..


          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)境參數(shù)的變量,增加OS所支持的字符集(前提要內(nèi)核上存在該字符,否則需要編譯內(nèi)核)...


          正在開(kāi)發(fā)的WEB系統(tǒng)是部署在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=


          ---------------------------------


          因?yàn)槌绦蚰夸浻腥舾晌募x出來(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命令就能顯示中文名(控制臺(tái))


          添加locale,估計(jì)你的系統(tǒng)不支持gbk字符集。


          ubuntu下是vi/var/lib/locales/supported.d/local


          加完后locale-gen一下,重新刷新字符集緩存。


          如果你需要在Linux中操作windows下的文件,那么你可能會(huì)經(jīng)常遇到文件編碼轉(zhuǎn)換的問(wèn)題。Windows中默認(rèn)的文件格式是GBK(gb2312),而Linux一般都是UTF-8。下面介紹一下,在Linux中如何查看文件的編碼及如何進(jìn)行對(duì)文件進(jìn)行編碼轉(zhuǎn)換。


          一、查看文件編碼:


          在Linux中查看文件編碼可以通過(guò)以下幾種方式:


          1、在Vim中可以直接查看文件編碼


          setfileencoding


          即可顯示文件編碼格式。


          如果你只是想查看其它編碼格式的文件或者想解決用Vim查看文件亂碼的問(wèn)題,那么你可以在


          ~/.vimrc文件中添加以下內(nèi)容:


          setencoding=utf-8


          fileencodings=ucs-bom,utf-8,cp936


          這樣,就可以讓vim自動(dòng)識(shí)別文件編碼(可以自動(dòng)識(shí)別UTF-8或者GBK編碼的文件),其實(shí)就是依照f(shuō)ileencodings提供的編碼列表嘗試,如果沒(méi)有找到合適的編碼,就用latin-1(ASCII)編碼打開(kāi)。


          2、enca(如果你的系統(tǒng)中沒(méi)有安裝這個(gè)命令,可以用sudoyuminstall-yenca安裝)查看文件編碼


          $encafilename


          filename:Universaltransformationformat8bits;UTF-8


          CRLFlineterminators


          需要說(shuō)明一點(diǎn)的是,enca對(duì)某些GBK編碼的文件識(shí)別的不是很好,識(shí)別時(shí)會(huì)出現(xiàn):


          Unrecognizedencoding


          二、文件編碼轉(zhuǎn)換


          1.在Vim中直接進(jìn)行轉(zhuǎn)換文件編碼,比如將一個(gè)文件轉(zhuǎn)換成utf-8格式


          :setfileencoding=utf-8


          2.iconv轉(zhuǎn)換,iconv的命令格式如下:


          iconv-fencoding-tencodinginputfile


          比如將一個(gè)UTF-8編碼的文件轉(zhuǎn)換成GBK編碼


          iconv-fGBK-tUTF-8file1-ofile2


          3.enconv轉(zhuǎn)換文件編碼


          比如要將一個(gè)GBK編碼的文件轉(zhuǎn)換成UTF-8編碼,操作如下


          enconv-Lzh_CN-xUTF-8filename


          三、文件名編碼轉(zhuǎn)換:


          從Linux往windows拷貝文件或者從windows往Linux拷貝文件,有時(shí)會(huì)出現(xiàn)中文文件名亂碼的情況,出現(xiàn)這種問(wèn)題的原因是因?yàn)椋瑆indows的文件名中文編碼默認(rèn)為GBK,而Linux中默認(rèn)文件名編碼為UTF8,由于編碼不一致,所以導(dǎo)致了文件名亂碼的問(wèn)題,解決這個(gè)問(wèn)題需要對(duì)文件名進(jìn)行轉(zhuǎn)碼。


          在Linux中專(zhuān)門(mén)提供了一種工具convmv進(jìn)行文件名編碼的轉(zhuǎn)換,可以將文件名從GBK轉(zhuǎn)換成UTF-8編碼,或者從UTF-8轉(zhuǎn)換到GBK。


          首先看一下你的系統(tǒng)上是否安裝了convmv,如果沒(méi)安裝的話用:


          yum-yinstallconvmv安裝。


          下面看一下convmv的具體用法:


          convmv-f源編碼-t新編碼[選項(xiàng)]文件名


          常用參數(shù):


          -r遞歸處理子文件夾


          –notest真正進(jìn)行操作,請(qǐng)注意在默認(rèn)情況下是不對(duì)文件進(jìn)行真實(shí)操作的,而只是試驗(yàn)。


          –list顯示所有支持的編碼


          –unescap可以做一下轉(zhuǎn)義,比如把%20變成空格


          比如我們有一個(gè)utf8編碼的文件名,轉(zhuǎn)換成GBK編碼,命令如下:


          convmv-fUTF-8-tGBK–notestutf8編碼的文件名


          這樣轉(zhuǎn)換以后”utf8編碼的文件名”會(huì)被轉(zhuǎn)換成GBK編碼(只是文件名編碼的轉(zhuǎn)換,文件內(nèi)容不會(huì)發(fā)生變化)


          四、vim編碼方式的設(shè)置


          和所有的流行文本編輯器一樣,Vim可以很好的編輯各種字符編碼的文件,這當(dāng)然包括UCS-2、UTF-8等流行的Unicode編碼方式。然而不幸的是,和很多來(lái)自Linux世界的軟件一樣,這需要你自己動(dòng)手設(shè)置。


          Vim有四個(gè)跟字符編碼方式有關(guān)的選項(xiàng),encoding、fileencoding、fileencodings、termencoding(這些選項(xiàng)可能的取值請(qǐng)參考Vim在線幫助:helpencoding-names),它們的意義如下:


          *encoding:Vim內(nèi)部使用的字符編碼方式,包括Vim的buffer(緩沖區(qū))、菜單文本、消息文本等。默認(rèn)是根據(jù)你的locale選擇.用戶(hù)手冊(cè)上建議只在.vimrc中改變它的值,事實(shí)上似乎也只有在.vimrc中改變它的值才有意義。你可以用另外一種編碼來(lái)編輯和保存文件,如你的vim的encoding為utf-8,所編輯的文件采用cp936編碼,vim會(huì)自動(dòng)將讀入的文件轉(zhuǎn)成utf-8(vim的能讀懂的方式),而當(dāng)你寫(xiě)入文件時(shí),又會(huì)自動(dòng)轉(zhuǎn)回成cp936(文件的保存編碼).


          *fileencoding:Vim中當(dāng)前編輯的文件的字符編碼方式,Vim保存文件時(shí)也會(huì)將文件保存為這種字符編碼方式(不管是否新文件都如此)。


          *fileencodings:Vim自動(dòng)探測(cè)fileencoding的順序列表,啟動(dòng)時(shí)會(huì)按照它所列出的字符編碼方式逐一探測(cè)即將打開(kāi)的文件的字符編碼方式,并且將fileencoding設(shè)置為最終探測(cè)到的字符編碼方式。因此最好將Unicode編碼方式放到這個(gè)列表的最前面,將拉丁語(yǔ)系編碼方式latin1放到最后面。


          *termencoding:Vim所工作的終端(或者Windows的Console窗口)的字符編碼方式。如果vim所在的term與vim編碼相同,則無(wú)需設(shè)置。如其不然,你可以用vim的termencoding選項(xiàng)將自動(dòng)轉(zhuǎn)換成term的編碼.這個(gè)選項(xiàng)在Windows下對(duì)我們常用的GUI模式的gVim無(wú)效,而對(duì)Console模式的Vim而言就是Windows控制臺(tái)的代碼頁(yè),并且通常我們不需要改變它。


          五、Vim的多字符編碼工作方式


          1.Vim啟動(dòng),根據(jù).vimrc中設(shè)置的encoding的值來(lái)設(shè)置buffer、菜單文本、消息文的字符編碼方式。


          2.讀取需要編輯的文件,根據(jù)fileencodings中列出的字符編碼方式逐一探測(cè)該文件編碼方式。并設(shè)置fileencoding為探測(cè)到的,看起來(lái)是正確的(注1)字符編碼方式。


          3.對(duì)比f(wàn)ileencoding和encoding的值,若不同則調(diào)用iconv將文件內(nèi)容轉(zhuǎn)換為encoding所描述的字符編碼方式,并且把轉(zhuǎn)換后的內(nèi)容放到為此文件開(kāi)辟的buffer里,此時(shí)我們就可以開(kāi)始編輯這個(gè)文件了。注意,完成這一步動(dòng)作需要調(diào)用外部的iconv.dll(注2),你需要保證這個(gè)文件存在于$VIMRUNTIME或者其他列在PATH環(huán)境變量中的目錄里。


          4.編輯完成后保存文件時(shí),再次對(duì)比f(wàn)ileencoding和encoding的值。若不同,再次調(diào)用iconv將即將保存的buffer中的文本轉(zhuǎn)換為fileencoding所描述的字符編碼方式,并保存到指定的文件中。同樣,這需要調(diào)用iconv.dll由于Unicode能夠包含幾乎所有的語(yǔ)言的字符,而且Unicode的UTF-8編碼方式又是非常具有性?xún)r(jià)比的編碼方式(空間消耗比UCS-2小),因此建議encoding的值設(shè)置為utf-8。這么做的另一個(gè)理由是encoding設(shè)置為utf-8時(shí),Vim自動(dòng)探測(cè)文件的編碼方式會(huì)更準(zhǔn)確(或許這個(gè)理由才是主要的。我們?cè)谥形腤indows里編輯的文件,為了兼顧與其他軟件的兼容性,文件編碼還是設(shè)置為GB2312/GBK比較合適,因此fileencoding建議設(shè)置為chinese(chinese是個(gè)別名,在Unix里表示gb2312,在Windows里表示cp936,也就是GBK的代碼頁(yè))。


          以上就是關(guān)于Linux下文件中文亂碼是如何處理的詳細(xì)介紹,最后扣丁學(xué)堂的Linux培訓(xùn)課程從基礎(chǔ)入門(mén)開(kāi)始教,不論學(xué)員是否擁有基礎(chǔ)在扣丁學(xué)堂都能順利的學(xué)習(xí),扣丁學(xué)堂不僅有專(zhuān)業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Linux視頻教程供學(xué)員觀看學(xué)習(xí),想要學(xué)好Linux開(kāi)發(fā)的小伙伴快快行動(dòng)吧。扣丁學(xué)堂PHP技術(shù)交流群:374332265。

        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



        關(guān)鍵詞:

        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 莱阳市| 洮南市| 台中县| 古交市| 象山县| 梓潼县| 井陉县| 阜平县| 淮北市| 无为县| 平谷区| 鄂温| 大英县| 横峰县| 庐江县| 静宁县| 阿克苏市| 遵义县| 柘荣县| 温宿县| 伊川县| 凉城县| 双桥区| 田东县| 鸡东县| 五常市| 中卫市| 尤溪县| 六盘水市| 长武县| 苗栗市| 四子王旗| 忻城县| 龙门县| 驻马店市| 广昌县| 泰来县| 南木林县| 衡山县| 太仓市| 梅河口市|