2016-05-11 29 views
0

Java 1.7以降、StandardCharsetsは標準ライブラリに含まれていますが、私は以前実装されていた多くのレガシーコードを使用しています。私はそれを実行するたびに(通常はコードをよりきれいにするために)StandardCharsetsに置き換えていますが、パフォーマンスクリティカルなセクションや簡単にデバッグできないエリアでこれらの変更を行うことについて心配しています。JavaでStandardCharsetsを使用しないという技術的な理由はありますか?

標準文字セットを使用しない技術的な理由はありますか?同様に、Guavaの文字セットやgetBytes( "UTF-8")の代わりにStandardCharsetsを使用することによって発生する可能性のある「不具合」や非効率性はありますか? 「これらの文字セットは、Javaプラットフォームのあらゆる実装で利用できることが保証されています」ということはわかっていますが、古いメソッドにはありません。それが何に影響を与える場合、UTF-8があり、また、

など、試してみて、上のトピックこれを維持し、他の開発者の好みのように、この影響を与える何の主観的な力はありませんと仮定し、変更するための抵抗に

私は本当に心配エンコーディング。

答えて

2

同様に、Guavaの文字セットやgetBytes( "UTF-8")の代わりにStandardCharsetsを使用することによって生じる可能性のある問題や非効率性はありますか?(OpenJDKの/ OracleのJDKに実装されている)すべての


まず、java.nio.charset.StandardCharsets.UTF_8は、com.google.common.base.Charsets.UTF_8org.apache.commons.io.Charsets.UTF_8はすべて正確に同じように実装されています:

public static final Charset UTF_8 = Charset.forName("UTF-8"); 

だから、少なくとも、あなたが持っていませんGuava Charsetsとの相違や、Charset.forName("UTF-8")との相違について心配する必要があります。 String.getBytes(Charset)については

  • String.getBytes(String)String.getBytes(Charset)については


    、私はドキュメントの違いを参照しています「このメソッドは、常にこの文字セットのデフォルトの置換バイトで不正入力シーケンスやマップ不可文字シーケンスを置き換えアレイ。"。

  • String.getBytes(String)の場合: "この文字列を指定された文字セットでエンコードできない場合のこのメソッドの動作は不定です。"

だから、あなたが使用しているJREに応じて、私はsomeString.getBytes("UTF-8")someString.getBytes(StandardCharsets.UTF_8)の間にマップできない文字の扱いに差があるかもしれません期待しています。

0

私は、これらの定数ではなく、実行時に見上げたする必要がある文字列を使用したパフォーマンス・クリティカルなセクション

を持っている分野におけるこれらの変化は、より速いだろうことについて心配しています。

私は簡単にデバッグできません。

私はデバッグしやすくするか、コードをそのままにしておくことをお勧めします。

標準文字セットを使用しない技術的な理由はありますか?

Java 7以上のJDKを使用していて、1.6以上のバージョンをターゲットにしている場合、コンパイラでは使用できますが、使用しないでください。 Java 7以降を使用している場合は、それを使用してください。ところで

UTF-8エンコーディングは、(\0 1文字の):DataOutputStream.writeUTFに異なっているJavaの9、StringStringBuilderからUTF-8の代わりに、UTF-16

0

最良の理由を使用します。 StandardCharsetsを使用しないことはおそらく特殊文字の使用になります。 Java 1以降、すべてのキャラクタが利用可能とは限りません。したがって、これは従来のプログラムには最適ですが、普遍的にアクセス可能ではなく、誰にとっても有用ではない可能性があります。

もう一度、これはおそらく大部分の人にとってはうれしいことです。ここではパフォーマンスの問題は想像できません。

2

forNameメソッドを使用して名前のスペルを誤って入力すると、UnsupportedCharSetExceptionが発生しないという理由だけで使用してください。

エラーの可能性を実行時からコンパイル時に「移動する」ことは、常に良いアイデアです。

関連する問題