web-dev-qa-db-ja.com

Java String.getBytes(charsetName)vs String.getBytes(Charset object)

UTF-8エンコーディングを使用して、文字列をバイト配列にエンコードする必要があります。私はGoogle guavaを使用しています。CharsetsクラスにはUTF-8エンコーディング用のCharsetインスタンスがすでに定義されています。私は2つの方法があります:

  1. String.getBytes(charsetName)

    try {        
        byte[] bytes = my_input.getBytes ( "UTF-8" );
    } catch ( UnsupportedEncodingException ex) {
    
    }
    
  2. String.getBytes(Charsetオブジェクト)

    // Charsets.UTF_8 is an instance of Charset    
    
    byte[] bytes = my_input.getBytes ( Charsets.UTF_8 );
    

私の質問は、どれを使うべきですか?それらは同じ結果を返します。方法2の場合、try/catchを設定する必要はありません! Javaソースコードを見ると、方法1と方法2が異なる方法で実装されていることがわかります。

誰にもアイデアはありますか?

20
Loc

文字列リテラル(「UTF-8」など)を使用する場合は、使用しないでください。代わりに2番目のバージョンを使用し、 StandardCharsets (具体的には、この場合は_StandardCharsets.UTF_8_)から定数値を指定します。

最初のバージョンは、文字セットがdynamicの場合に使用されます。これは、コンパイル時に文字セットが何であるかわからない場合に当てはまります。構成ファイルまたはシステムプロパティなどから読み取られるエンドユーザーによって提供されます。

内部的には、両方のメソッドがStringCoding.encode()のバージョンを呼び出しています。 encode()の最初のバージョンは、指定された名前で最初にCharsetを検索し、その文字セットが不明または利用できない場合に例外をスローします。

18
Brian Roach

最初のAPIは、コンパイル時に文字セットがわからない場合に使用します。 2つ目は、あなたが行う状況です。コードには特にUTF-8が必要と思われるため、2番目のAPIを選択する必要があります。

byte[] bytes = my_input.getBytes ( Charsets.UTF_8 ); // <<== UTF-8 is known at compile time

最初のAPIは、文字セットがoutsideプログラムからのものである場合-たとえば、構成ファイル、ユーザー入力、サーバーへのクライアント要求の一部などからのものです。そのため、そこからスローされたチェック済み例外があります-構成または他の手段で指定された文字セットが利用できない場合。

10
dasblinkenlight

それらは同じ結果を返すので、一般的に安全で効率的な方法2を使用する必要があります。これは、ライブラリにユーザー指定の文字列を解析し、場合によってはブレークするように依頼することを避けるためです。また、try-catchを回避すると、独自のコードがよりきれいになります。

Charsets.UTF_8はコンパイル時により簡単に確認できます。これが、おそらくtry-catchを必要としない理由です。

3
merlin2011

既にCharsetを持っている場合は、エラーが発生しにくいため、2番目のバージョンを使用します。

2
Andres