(linux)中文顯示亂碼問題解決方法(編碼檢視及轉換)
前言
我們在使用Linux系統中,經常會發生這樣一類問題。檔案的中文部分出現亂碼。有的時候,是檔名的中文部分出現亂碼;有的時候是,檔案內容中的中文部分出現亂碼。
下面要介紹的就是Linux中,各類中文亂碼的解決方法。
示例
圖中名為一個.sql檔案的一段內容,是一個數據庫檔案。其在windows中開啟顯示正常,在Linux中,中文部分顯示為亂碼。
注意:這個與資料庫亂碼的情況不同,屬於檔案內容的亂碼。
解析
Linux系統與windows系統在編碼上有顯著的差別。Windows中的檔案的格式預設是GBK(gb2312),而Linux系統中檔案的格式預設是UTF-8。這兩個系統就好比是中國和日本。檔案就好比是一個人,如果要在另外的國家居住就要辦理居住許可證,使用他國的證件(編碼和字符集),否則是不被允許的黑戶。因此,解決中文亂碼問題要從編碼和字符集著手。
檔案出現編碼錯誤的原因:
當前系統的字符集有問題
某個檔案的編碼有問題
解決方法1:從系統的字符集處理
當系統中多個檔案的內容出現亂碼問題,或者中文檔名顯示亂碼時,就先從系統的字符集處理。
常用字符集:
中文
LANG=“zh_CN.UTF-8”
英文
LANG=“en_US.UTF-8”
或
LANG=C
【1】字符集檢視
<1>檢視當前系統預設採用的字符集
locale
<2>檢視系統當前字符集
echo $LANG
<3>檢視系統是否安裝中文字符集
出現zh開頭的,即為安裝了中文字符集
如未安裝,需執行: yum -y groupinstall chinese-support
locale -a |grep zh
【2】修改系統字符集
<1>修改系統字符集為中文
如果前面檢視到的系統當前的字符集是英文,通常修改系統字符集為中文即可成功。
臨時修改(當前終端生效): export LANG="zh_CN.UTF-8" 永久修改: echo "export LANG="zh_CN.UTF-8" >> /etc/proflile source /etc/profile
<2>檢視
解決方法2:從檔案的編碼處理
當系統的字符集為中文,檔案的中文部分仍然顯示亂碼,就從檔案的編碼格式處理。
【1】檢視檔案編碼
<1>檢視檔案編碼(vim方式)
用vim開啟檔案,輸入:set fileencoding
fileencoding後即為該檔案編碼格式
<2>檢視檔案編碼(file方式)
file 檔名
或
file --mime-encoding 檔名
【2】修改檔案的字符集
<1>檔案的編碼轉換(vim方式)
這個方法,僅在vim檢視時進行編碼轉換,檔案實際上本身編碼並未轉換,僅僅只是可看到。
臨時轉換:
用vim開啟檔案,輸入:set fileencoding=utf-8
永久轉換(先確認vimrc位置):
echo "set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936" >> /etc/vimrc
或
echo "set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936" >> ~/.vimrc
vim會依照fileencodings提供的編碼列表,查詢合適的編碼,如果沒有找到就用latin-1(ASCII)編碼開啟.
<2>檔案的編碼轉換(iconv方式)
該命令可進行檔案內容的編碼轉換,並輸出到其他位置(檔案)
命令引數
-f encoding 把字元由原來的編碼開始轉換
-t encoding 把字元轉換為新編碼
-l 列出支援的編碼字元(可選)
-o file 指定輸出檔案(可選)
-c 忽略輸出的非法字元(可選)
-s 禁止輸出警告資訊(可選)
--verbose 顯示進度(可選)
{1}.列出當前支援的字元編碼
iconv -l
{2}.編碼轉換
基本格式:
iconv -f 原編碼 -t 新編碼 原檔案 -o 新檔案
或
iconv -f 原編碼 -t 新編碼 原檔案 > 新檔案
示例:將UTF-8編碼的wx.txt檔案轉換為GB2312編碼的test01.txt
iconv -f UTF-8 -t GB2312 wx.txt -o test01.txt
<3>檔名編碼轉換(convmv方式)
該命令可轉換檔名的編碼(只是檔名編碼的轉換,檔案內容不會發生變化)
安裝命令:yum -y install convmv
命令引數
-f 後面是原來的編碼方式
-t 後面是要轉換為的編碼方式
-r 遞迴處理子資料夾
-i 詢問每一個轉換
--notest 真實的執行,在預設情況下只會測試(只能以root許可權執行)
{1}編碼轉換
基本格式:
convmv -f 原編碼 -t 新編碼 --notest(可選) 檔名
或
convmv -f 原編碼 -t 新編碼 --notest(可選) -r 目錄名
示例:將read目錄下的UTF-8編碼的檔名轉換為GBK編碼
convmv -f UTF-8 -t GBK --notest -r read/
<4>檔案的編碼轉換(enca方式)
該工具能自動識別檔案編碼,且支援批量轉換
安裝命令:yum -y install enca
{1}.編碼轉換
基本格式
enca -L 原編碼 -x 新編碼 檔名
或
enca -L 原編碼 -x 新編碼 目錄名
示例1:把當前目錄下的所有檔案都轉成utf-8
enca -L zh_CN -x utf-8 *
示例2:檢查檔案的編碼
enca -L zh_CN test.txt
示例3:將test.txt檔案編碼轉換為"UTF-8"編碼
enca -L zh_CN -x UTF-8 test.txt
示例4:將test.txt檔案編碼轉換為"UTF-8"編碼,並輸入test2.txt中
enca -L zh_CN -x UTF-8 < test.txt > test2.txt