2013-10-01 13 views
8

Tôi đang sử dụng Spreadsheet::ParseExcel để phân tích một tập tin bảng tính Excel như sauSử dụng Perl để đọc các ký tự tiếng Pháp từ một bảng tính Excel

my $FileName = "../excel.xls"; 
my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse($FileName); 

Và đọc các giá trị từ các tế bào như thế này

$product = $worksheeto->get_cell($row, 0)->value(); 

Vấn đề là rằng, khi có một ký tự tiếng Pháp, ví dụ: à, nó hiển thị ò

Để chắc chắn rằng ở đó tôi s không có lỗi trong phân tích cú pháp tôi sử dụng

print unpack('H*', $product) . "\n"; 

Vì vậy, khi tôi sử dụng bất kỳ hex trực tuyến để chuyển đổi chuỗi tôi làm được à.

Tôi cũng đã cố gắng

use utf8; 
binmode(STDOUT, ":utf8"); 

nhưng thay vì à tôi nhận được

Có cách nào để có được những nhân vật có đúng không?

Trả lời

7

Hãy thử phân tích các tập tin với một định dạng, ví dụ như Spreadsheet::ParseExcel::FmtUnicode:

use Spreadsheet::ParseExcel; 
use Spreadsheet::ParseExcel::FmtUnicode; 
#use Spreadsheet::ParseExcel::FmtJapan; 

my $FileName = '../excel.xls'; 
my $parser = Spreadsheet::ParseExcel->new();    
my $formatter = Spreadsheet::ParseExcel::FmtUnicode->new(); 
my $workbook = $parser->parse($FileName,$formatter); 

Hãy thử cũng là FmtJapan, kể từ khi documentation says: Các bảng tính :: ParseExcel :: FmtJapan formatter cũng hỗ trợ Unicode. Nếu bạn gặp bất kỳ sự cố mã hóa nào với trình định dạng mặc định, hãy thử thay vào đó.

* CẬP NHẬT: Tôi đã tự mình thử nghiệm trong tệp xls với các ký tự Hy Lạp nhưng không hoạt động với FmtUnicode hoặc FmtJapan. Sau đó tôi tìm thấy số này perlmonks post, sử dụng mô-đun My::Excel::FmtUTF8 được cung cấp và đã hoạt động thành công khi in các giá trị của ô bằng $cell->value().

+1

Tôi đã thử 'FmtJapan', nhưng không hoạt động, tôi không sử dụng' FmtUnicode' nghĩ rằng nó là theo mặc định, tôi sẽ thử nó ngay bây giờ và cho bạn biết kết quả. – Mugiwara

+1

Mặc định có vẻ là 'FmtDefault' – psxls

+1

Có bạn đúng, nhưng ngay cả với' FmtUnicode' tôi cũng nhận được kết quả tương tự như 'binmode (STDOUT,": utf8 ");' có nghĩa là '├á', vấn đề là tôi đang chuyển nó đến một chức năng khác cần 'à':/ – Mugiwara

2

Tôi đã thử những gì bạn mô tả và hoạt động chính xác ở đây, sau khi tôi bật đầu ra utf-8. Tôi đoán bạn hoặc có một tập tin excel lạ (bạn nên gửi một ví dụ ở đâu đó), hoặc thiết bị đầu cuối của bạn là cấu hình xấu.

Xử lý các vấn đề về bộ ký tự là khó, vì thiết bị đầu cuối của bạn có thể làm tôi khó hiểu. Vì vậy, nó luôn luôn là một ý tưởng tốt để ống đầu ra thành 'od -c' để xem những gì bạn đang nhận được. Trong kịch bản của tôi tôi nhận được văn bản này từ một bảng tính tôi đã nằm xung quanh:

Value  = Descripción 

Và khi tôi ống thông qua od:

0000000 V a l u e        =  D e 
0000020 s c r i p c i 303 263 n \n 

Tôi có thể thấy rằng ó là dài hai byte, điều này gợi ý là UTF-8. Để chắc chắn, bạn có thể hỏi iconv để chuyển đổi từ charset kết quả mong muốn bất cứ điều gì bạn đang sử dụng trong thiết bị đầu cuối của bạn:

iconv -f utf-8 

Nếu đầu vào không phải là thích hợp utf-8 nó sẽ sủa vào bạn và/hoặc sản lượng thậm chí rác rác.

Các vấn đề liên quan