工作需要,閑暇之余,仔細研究了一下腳本亂碼的問題
1. vim新建的文件
1)在linux命令行 vim命令建立的文件,如果內容中不出現中文,默認是ASCII。那么用notepad++打開的時候,就是“以ASC格式編碼”。如下面的: 99.txt
2) 如果vim在建立文件的時候,故意在文件中插入中文(我的secureCRT是utf8的),此時文件內容不會亂碼,而且vim保存文件后,再用vim打開也會看到中文,沒有亂碼。我猜測應該是Linux碰到中文,自動就轉換成文檔應該用utf8而不是asc保存了。如下圖的: 88.txt
2. notepad++編輯不含中文漢字的ASC文件,增加漢字內容后的變化。如下圖:
可以看到: 在99.txt中增加漢字后,文檔變成了ISO-8859格式!以前全部是字母數字的內容。雖然增加了漢字,然后用notepad++打開不亂碼,可是使用vim打開 有漢字的99.txt,那么漢字就顯示亂碼了!
3. 如果是可執行腳本程序文件,一個是ASC(iso-8859在這里也成為asc)的,如下:pp.pl ; 另一個是utf8的,如下:ss.pl 。他們兩個都有輸出漢字內容的"print" 語句!結果如下:
結論:可執行腳本文件 產生 的標准輸出 內容,與源文件的編碼方式有關。輸出內容的編碼和源腳本的編碼相同!由於pp.pl是iso-8859,所以只需它輸出的 f1 也是同樣的格式!
4. 下面舉例解決編碼轉換的問題,只討論 pp.pl文件。
如果我想pp.pl 文件的輸出是 utf8 ,而且在終端上是可以看到輸出的中文字符,那么代碼如下:
#!/usr/bin/perl -w
use Encode;
$str = "吳俊傑1";
#$str = encode("utf-8",decode("GB2312",$str));
$str = encode("utf-8",decode("ISO-8859-1",$str));
print $str;
print "\n";
下面是代碼執行結果:
從上圖可以看出,對於有漢字的時候,應該用 GB2312 轉 utf8 。雖然文件字符串是 ISO-8859的,可是ISO-8859字符集里面沒有 那些中文字符,所以轉換后打印是亂碼,所以要用包含iso-8859字符編碼的GBK或者GB2312來轉換就可以了。我的理解是:GBK應該包含了iso-8859的所有吧!
5. 下面引出 perl中字符編碼的轉換:
摘自: http://blog.sina.com.cn/s/blog_477759e701010198.html
use Encode;
gbk轉uft-8:
$line = encode("utf-8",decode("gbk",$line));
或
$line = encode_utf8(decode("gbk",$line));
utf-8轉gbk:
$line = encode("gbk", decode("utf8", $line));
uft-8轉gb2312:
$line = encode("gb2312", decode("utf8", $line));