博客專欄

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

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

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

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

  首先,我們先要知道控制LinuxOS的語言環(huán)境變量是$LANG和$LC_ALL,要解決亂碼的情況我們只需要把上述的兩個變量正確設(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即可...


  由于中文的字符集編碼很多,我自己也不是十分清楚彼此的兼容性如何,所以就盡可能的找了很多種不同的編碼都寫了上去,大家也可以自己篩選下,總的解決思路就是修改控制環(huán)境參數(shù)的變量,增加OS所支持的字符集(前提要內(nèi)核上存在該字符,否則需要編譯內(nè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出來顯示在頁面上,文件名為中文名


  我使用File.list()方法得到了文件名列表,可是顯示出來的都是亂碼。


  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,估計(jì)你的系統(tǒng)不支持gbk字符集。


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


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


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


  一、查看文件編碼:


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


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


  setfileencoding


  即可顯示文件編碼格式。


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


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


  setencoding=utf-8


  fileencodings=ucs-bom,utf-8,cp936


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


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


  $encafilename


  filename:Universaltransformationformat8bits;UTF-8


  CRLFlineterminators


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


  Unrecognizedencoding


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


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


  :setfileencoding=utf-8


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


  iconv-fencoding-tencodinginputfile


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


  iconv-fGBK-tUTF-8file1-ofile2


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


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


  enconv-Lzh_CN-xUTF-8filename


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


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


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


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


  yum-yinstallconvmv安裝。


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


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


  常用參數(shù):


  -r遞歸處理子文件夾


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


  –list顯示所有支持的編碼


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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

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



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉