2012-10-21 14 views
13

tôi đã chạy một ứng dụng perl trong đó sử dụng /opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pmPerl Encode.pm không thể giải mã chuỗi với nhân vật rộng

và vấn đề lỗi

Không thể giải mã chuỗi với ký tự rộng ở/opt/local/lib/Perl5/5.12.4/darwin-thread-đa-2level/Encode.pm dòng 174.

dòng 174 của Encode.pm đọc

sub decode($$;$) { 
    my ($name, $octets, $check) = @_; 
    return undef unless defined $octets; 
    $octets .= '' if ref $octets; 
    $check ||= 0; 
    my $enc = find_encoding($name); 
    unless (defined $enc) { 
     require Carp; 
     Carp::croak("Unknown encoding '$name'"); 
    } 
    my $string = $enc->decode($octets, $check); # line 174 
    $_[1] = $octets if $check and !ref $check and !($check & LEAVE_SRC()); 
    return $string; 
} 

Bất kỳ giải pháp nào khác?

Trả lời

7

Tôi gặp sự cố tương tự. $enc->decode($octets, $check); mong đợi các octet.

Vì vậy, hãy đặt Encode::_utf8_off($octets) trước đây. Nó làm cho nó hoạt động cho tôi.

+1

Cảm ơn điều này đã làm việc tốt! – MinaHany

+0

Không bao giờ sử dụng '_utf8_off'. Sử dụng hàm này vốn đã lỗi bởi vì '_utf8_off ($ s)' là viết tắt của 'utf8 :: encode ($ s) nếu is_utf8 ($ s);'. Hoặc là mã hóa hoặc không, nhưng không làm điều đó dựa trên một cái gì đó ngẫu nhiên! – ikegami

2

Thông báo lỗi đó nói rằng bạn đã chuyển một chuỗi đã được giải mã (và chứa các ký tự trên codepoint 255). Bạn không thể giải mã nó một lần nữa.

10

encode lấy một chuỗi các điểm mã Unicode và nối tiếp chúng thành một chuỗi byte.

decode lấy một chuỗi byte và deserialises chúng thành các điểm mã Unicode.

Thông báo đó có nghĩa là bạn đã chuyển một chuỗi chứa một hoặc nhiều ký tự ở trên 255 (không phải byte) đến decode, rõ ràng là một đối số không chính xác.

>perl -MEncode -E"for (254..257) { say; decode('iso-8859-1', chr($_)); }" 
254 
255 
256 
Wide character in subroutine entry at .../Encode.pm line 176. 

Bạn yêu cầu giải pháp, nhưng lỗi là của bạn. Có lẽ bạn đang vô tình cố gắng giải mã một cái gì đó bạn đã giải mã?

+2

Dữ liệu nhập của người dùng hiếm khi được định dạng tốt và tôi phải xử lý các tệp được mã hóa không đúng lúc. Sẽ rất tuyệt nếu 'decode' có thể bỏ qua các ký tự không hợp lệ, nhưng trên máy tính của tôi, ngay cả với' Encode :: FB_QUIET' được chuyển thành đối số thứ ba, nó vẫn chết. – rjh

+1

@ rjh, Điều đó không liên quan gì đến vấn đề của OP. Vấn đề của ông không liên quan gì đến các tập tin được mã hóa nặng. – ikegami

+1

không đúng sự thật. Tôi tìm thấy câu trả lời này bởi vì tôi nhận được cùng một lỗi cố gắng giải mã một tập tin đầu vào được mã hóa kém. Cụ thể GB18030 được mã hóa bằng cách sử dụng chuyển đổi ISO-8859-1 sang UTF-8 nhưng cũng chứa các chuỗi UTF-8 hợp lệ (!). – rjh

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