理解perl的編碼轉換——utf8以及亂碼


工作需要,閑暇之余,仔細研究了一下腳本亂碼的問題

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));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM