我有一個CSV文件,說win.csv,其文本編碼在windows-1252。首先,我使用iconv使它成爲utf8。如何從Text :: CSV utf8輸出?
$iconv -o test.csv -f windows-1252 -t utf-8 win.csv
然後我讀出的變換CSV具有以下Perl腳本(utfcsv.pl)文件。
#!/usr/bin/perl
use utf8;
use Text::CSV;
use Encode::Detect::Detector;
my $csv = Text::CSV->new({ binary => 1, sep_char => ';',});
open my $fh, "<encoding(utf8)", "test.csv";
while (my $row = $csv->getline($fh)) {
my $line = join " ", @$row;
my $enc = Encode::Detect::Detector::detect($line);
print "($enc) $line\n";
}
$csv->eof || $csv->error_diag();
close $fh;
$csv->eol("\r\n");
exit;
然後輸出如下。
(UFT-8) .........
() .....
即所有行的編碼都被檢測爲UTF-8(或ASCII)。但實際輸出似乎不是UTF-8。事實上,如果我節省然後output.txt的的編碼被檢測爲窗口1252文件
$./utfcsv.pl > output.txt
的輸出。
問題:如何獲得UFT-8中的輸出文本?
注:
- 環境:openSUSE的13.2 x86_64的,Perl 5.20.1
- 我不使用文字:: CSV ::編碼,因爲安裝失敗。 (因爲test.csv是以UTF-8轉換的,所以使用Text :: CSV :: Encoded很奇怪。)
- 我使用以下腳本來檢查編碼。 (我也用它來找出初始CSV文件win.csv的編碼。)
。
#!/usr/bin/perl
use Encode::Detect::Detector;
open my $in, "<","$ARGV[0]" || die "open failed";
while (my $line = <$in>) {
my $enc = Encode::Detect::Detector::detect($line);
chomp $enc;
if ($enc) {
print "$enc\n";
}
}
您的文本是否包含ASCII以外的任何字符?是的,確定真正的編碼應該沒有問題。否則,編碼檢測器給出任意結果。 –
是的。我正在處理一個包含很多ü的德文文本。 –
嘗試從http://stackoverflow.com/questions/627661/how-can-i-output-utf-8-from-perl的最佳答案 - 我很確定這會爲您解決這個問題! – Gaurav