2012-10-21 12 views
13

我跑它採用/opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pm的Perl Encode.pm不能與寬字符

,併發出錯誤一個Perl程序解碼字符串

上的/ opt/local/lib目錄無法解碼字符串寬字符/的perl5/5.12.4 /達爾文線程多2level/Encode.pm線174

Encode.pm 174讀取

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; 
} 

任何解決方法?

回答

7

我有類似的問題。 $enc->decode($octets, $check);需要八位字節。

因此把Encode::_utf8_off($octets)之前。它使它爲我工作。

+1

謝謝,這工作得很好! – MinaHany

+0

切勿使用'_utf8_off'。如果使用is_utf8($ s);'',那麼使用這個函數本質上是有問題的,因爲'_utf8_off($ s)'是'utf8 :: encode($ s)的簡寫。要麼編碼或不要,但不要根據隨機的東西來做! – ikegami

2

該錯誤消息說您已傳入已解碼的字符串(並且包含代碼點255以上的字符)。你不能再解碼它。

10

encode需要一串Unicode代碼點並將它們串聯到一個字節串中。

decode需要一串字節並將它們反序列化爲Unicode代碼點。

該消息表示您將包含一個或多個255(非字節)以上字符的字符串傳遞給decode,這顯然是不正確的參數。

>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. 

你問一個解決方法,但錯誤是你的。也許你不小心試圖解碼你已經解碼的東西?

+2

用戶輸入很少格式化,我必須始終處理嚴重編碼的文件。如果'decode'可以跳過無效字符,但在我的機器上,即使使用Encode :: FB_QUIET作爲第三個參數,它仍然會死掉。 – rjh

+1

@rjh,這與OP的問題沒有任何關係。他的問題與嚴重編碼的文件無關。 – ikegami

+1

這是不真實的。我找到了這個答案,因爲我得到了同樣的錯誤,試圖解碼一個編碼不好的輸入文件。具體而言,GB18030使用ISO-8859-1編碼爲UTF-8轉換,但也包含有效的UTF-8序列(!)。 – rjh