4

文字列を文字セットから別の文字セットに変換する前に、この変換がロスレスになるかどうかを知ることは可能ですか?

たとえば、UTF-8 文字列を latin1 に変換しようとすると、変換できない文字が に置き換えられ?ます。結果の文字列をチェックし?て、変換がロスレスであるかどうかを確認することは、明らかに選択肢ではありません。

私が今見ることができる唯一の解決策は、元の文字セットに戻し、元の文字列と比較することです:

function canBeSafelyConverted($string, $fromEncoding, $toEncoding)
{
    $encoded = mb_convert_encoding($string, $toEncoding, $fromEncoding);
    $decoded = mb_convert_encoding($encoded, $fromEncoding, $toEncoding);

    return $decoded == $string;
}

ただし、これは簡単で汚いものであり、予期しない動作が発生する場合があり、 mbstringiconv、またはその他のライブラリを使用してこれを行うよりクリーンな方法があると思います。

4

1 に答える 1

0

別の方法は、set_error_handler()を使用して独自のエラーハンドラーを設定することです。文字列でiconv()を使用すると、完全に変換できない場合に、そこでキャッチしてコードで反応できるという通知がスローされます。

または、エンコードの前後の疑問符の数を数えることもできます。または、// IGNOREを指定してiconv()を呼び出し、文字数をカウントします。

あなたの提案よりもはるかにエレガントな提案はありませんが、二重処理を取り除きます。

于 2012-08-24T22:02:52.053 に答える