內含特殊字元(如"許功蓋")
如果程式不去面對並處理這個問題
那執行結果是否正確就要靠一點運氣了
舉例說明
需求:「硬碟越來越大,檔案數量膨脹,尋找不易,
利用程式產生檔案清單(檔名可能中英文夾雜),方便尋找。」
use strict;
use Cwd;
use File::Basename;
use File::Find::Rule;
my $path = getcwd();
my @ftypes = qw/*.doc *.pdf *.zip *.chm *.exe *.rar *.iso *.xls/;
my $rule = File::Find::Rule->file->name(@ftypes)->start( "$path" );
while ( my $file = $rule->match ) {
printf "%s \t %s\n", dirname($file), basename($file);
}(部分輸出結果-許不見了!!)
> F:/資料/038? 名人-危機處理.doc
> F:/資料/038? 名人-員工問題.doc
> F:/資料/038? 名人-員工問題.doc
為了正確處理big5碼中文,釐清Perl的處理方式,結論如下:
1. 一律使用use encoding 'big5'
2. 使用decode轉換外來資料,使用encode轉換外送資料
use strict;
use encoding 'big5';
use Cwd;
use File::Basename;
use File::Find::Rule;
use Encode qw/decode encode/;
my $path = getcwd();
my @ftypes = qw/*.doc *.pdf *.zip *.chm *.exe *.rar *.iso *.xls/;
my $rule = File::Find::Rule->file->name(@ftypes)->start( "$path" );
while ( my $file = $rule->match ) {
my $bfile = decode('big5', $file);
printf "%s \t %s\n", dirname($bfile), basename($bfile);
}(部分輸出結果-正確)
< F:/資料 038許名人-危機處理.doc
< F:/資料 038許名人-員工問題.doc
後記.
資料來自四面八方,處理編碼這類的問題前提是,
必須知道資料的編碼,才能正確的處理輸入及輸出。
Perl由語言內部解決了多國編碼的問題,但只提供了工具,
如何正確的處理還是有賴於正確的觀念與寫法。
沒有留言:
張貼留言