1

基本的にこれのバージョンと思われる Perl コードのバグを追跡しています。

「ワイド文字を含む文字列をデコードできません」が奇妙な場所に表示される

基本的に、特定の条件下でEncode::decode('utf8', $string)は、同じ文字列で が 2 回呼び出され、陽気になります。ここでの最善の解決策は、ダブル デコードを引き起こしている条件を特定し、それを阻止することです。残念ながら、これは機能豊富な製品の成熟した製品コードです。これらの条件を把握し、回帰エラーを導入しない方法でそれらを修正することは困難に見えます。

文字列が既に utf8 からデコードされているかどうかを検出するための高速で信頼できる方法はありますか? これらの呼び出しの前に「if」ステートメントを挿入するのは少し面倒ですが、かなり安全な修正であるはずです。

4

2 に答える 2

5

スカラーにデコードされた文字列が含まれているかどうかを正しく検出することは不可能です。その情報をPerlに伝達する方法はないので、Perlがそれをあなたに伝達する方法はありません。せいぜい、推測することができます。使用できるヒューリスティックがいくつかあります。最も信頼できるものから最も低いものへ:

  1. 文字列に255を超える文字が含まれている場合、エンコードされません。これがまさに「ワイド文字」の警告/エラーの原因です。

    utf8::encode($s) if /[^\x00-\xFF]/;
    
  2. スカラーがエンコードされていて、スカラーに有効なUTF-8が含まれている場合、スカラーがUTF-8を使用してエンコードされる場合は、おそらくエンコードされています。

  3. スカラーがエンコードされていて、スカラーに有効なUTF-8が含まれていない場合に、スカラーがUTF-8を使用してエンコードされる場合は、おそらくデコードされています。

    utf8::encode($s) if !utf8::decode(my $tmp = $s);
    
  4. スカラーのUTF8フラグがオンの場合、文字列はおそらくデコードされます。

  5. スカラーのUTF8フラグがオフの場合、文字列はおそらくデコードされません。

    utf8::encode($s) if utf8::is_utf8($s);
    

すべての入力をデコードし、すべての出力をエンコードする必要があります。

于 2011-08-11T22:59:30.077 に答える
1

エンコードにはis_utf8関数があります。

is_utf8(STRING [, チェック])

[内部] STRING で UTF8 フラグがオンになっているかどうかをテストします。CHECK が true の場合、STRING 内のデータが整形式の UTF-8 かどうかもチェックします。成功した場合は true、そうでない場合は false を返します。

ドキュメントのキャプションは "Messing with Perl's Internals"であることに注意してください。この関数は将来の perl バージョンで変更される可能性があります。

于 2011-08-11T17:41:04.857 に答える