4

私はこれらの2つの文字列を持っています:

%EC%E0%EC%E0+%EC%FB%EB%E0+%F0%E0%EC%F3
%D0%BC%D0%B0%D0%BC%D0%B0%20%D0%BC%D1%8B%D0%BB%D0%B0%20%D1%80%D0%B0%D0%BC%D1%83

これは、ロシア語でそれぞれ cp-1251 と utf-8 で URL エンコードされたフレーズです。perl を使用して、utf-8 端末でそれらをロシア語で表示したいです。残念ながら、perl モジュール Encode::Detect (url デコード後) は、最初の例の cp-1251 を検出できません。代わりに、「x-euc-tw」を提案します。

問題は、この場合に適切なエンコーディングを検出する適切な方法は何ですか (ロケールパラメーターを指定する、他のモジュールを使用する...)?

4

2 に答える 2

4

UTF-8 と cp1251 の 2 つのオプションだけですか? 有効な UTF-8 でもある cp1251 テキストを持つ可能性は非常に小さいです。(それは意味不明です。)だから、あなたはすることができます

use Encode qw( decode );
my $decoded = eval { decode('UTF-8', $encoded, Encode::FB_CROAK) }
    // decode('cp1251', $encoded);

これは、エンコーディング推測よりもはるかに正確です。

于 2012-07-27T17:45:31.077 に答える
4

Encode::DetectMozilla Universal Character Set Detector を使用する は、さまざまな文字セット プローバーにデータを見てもらうことで機能します。次に、プローバーはさまざまな信頼レベルを報告し、信頼度が最も高いプローバーが勝ちます。このプロセスは入力のみに依存します。ロケールやその他の外部設定の影響を受けません。この場合、何らかの理由で、euc-tw のプローバーは windows-1251 のプローバーよりも高い信頼性を報告しており、データの変更またはソース コードの変更以外にできることは何もありません。

Encode::Guess選択するエンコーディングのリストを指定できる which を使用してみてください。

于 2012-07-27T17:29:12.307 に答える