2010年6月23日 星期三

再一次探討使用Perl處理中文的正確方法(Windows平台)

由於big5碼中部分中文字
內含特殊字元(如"許功蓋")
如果程式不去面對並處理這個問題
那執行結果是否正確就要靠一點運氣了

舉例說明

需求:「硬碟越來越大,檔案數量膨脹,尋找不易,
利用程式產生檔案清單(檔名可能中英文夾雜),方便尋找。」

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

為了正確處理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由語言內部解決了多國編碼的問題,但只提供了工具,
如何正確的處理還是有賴於正確的觀念與寫法。

沒有留言:

張貼留言