21

ライブラリメソッド内でString.getBytes( "UTF-8")を呼び出すときにUnsupportedEncodingExceptionを処理するための推奨される方法は何ですか?

http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.htmlを正しく読んでいる場合、UTF-8エンコーディングは常に利用可能であるはずです。これにより、この例外をライブラリのコンシューマに渡す理由(つまりthrows、メソッド署名に句を追加する)。UTF-8エンコーディング機能を利用できなくなった障害モードは壊滅的であり、このハンドラーを作成することになります。

    try
    {
        ....
        return "blah".getBytes("UTF-8");
    }
    catch (UnsupportedEncodingException e)
    {
        // we're assuming UTF-8 encoding is always available.
        // see
        // http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html
        e.printStackTrace();
        return null; //prevent compile-time "method must return a result" errors
    }

このスニペットでは対処できない障害モードはありますか?

4

3 に答える 3

53

あなたは私が何をするか知っていますか?

return "blah".getBytes( Charset.forName( "UTF-8" ) );

これはチェック例外をスローしません。

更新: Java 1.7 以降、StandardCharsetsがあります。

return "blah".getBytes( StandardCharsets.UTF_8 );
于 2012-05-25T04:40:04.347 に答える
3

UTF-8 が常に利用可能かどうかを調べようとしているときに、この質問に出くわしました。リンクをありがとう。

使用できることが保証されている特定の文字セットを使用したエンコードとデコードに関しては、チェック例外をスローする必要がないことに同意します。文字セットが渡された変数である場合、おそらく UnsupportedEncodingException をスローします。

これは、同様の Android コードで行っていることです。

public static String encode(String input) {
    try {
        return URLEncoder.encode(input, CharEncoding.UTF_8);
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
}

CharEncoding.UTF_8「UTF-8」の単なるApache Commonsの文字列定数です。

Judge Mental の使用に関する提案StandardCharsets.UTF_8は素晴らしいものですが、Android 開発を行っている私たちにとっては、SDK 19 (KitKat) 以降でのみ使用できます。

于 2015-08-07T20:03:54.420 に答える