String.getBytes()を使用しても安全ですか? プログラムが異なるシステムで異なるデフォルトで実行されるとどうcharset?
なりますか 異なるコンテンツを取得できると思いbyte[]?
ます 優先文字セットを定義することは可能ですかJava 1.4?
5 に答える
String.getBytes() を使用しても安全ですか?
いいえ。文字セットを指定するオーバーロードを常に使用する必要があります。理想的にはどこでも UTF-8 を使用します。最新バージョンの Java を使用している場合、コードはStandardCharsets
Good Clean Living に使用できます。
プログラムが異なるデフォルト文字セットを持つ異なるシステムで実行されるとどうなりますか?
あなたのコードは、間違ったエンコーディングで文字データを解釈する危険性があり、その結果、壊れた/間違った文字列 (例: "î"
, "ÃÂ"
, "ü"
) および/または置換文字 (�) が生成されます。
Java 1.4で優先文字セットを定義することは可能ですか?
安全に使用でき
String.getBytes()
ますか?
「安全」が何を意味するかによります。それはあなたがやろうとしていることを正確に行います。
プログラムが異なるデフォルト文字セットを持つ異なるシステムで実行されるとどうなりますか? 別のコンテンツ バイト [] を取得できると思いますか?
はい。多くの場合、文字列に ASCII のみが含まれている場合は違いを見つけることはできませんが、それでも大きな違いがある可能性があります。たとえば、UTF-16 では各文字が 2 バイトになります。
Java 1.4で優先文字セットを定義することは可能ですか?
私が知っているわけではありません。たとえば、これに対する標準のシステム プロパティについては知りません。もちろん、使用している特定の実装用のものがあるかもしれません。それはあなたの文脈に依存します。(file.encoding
たとえば、コマンド ラインでシステム プロパティを設定できます。それが既定のエンコーディングに影響するかどうかは、VM によって異なります。 には記載されていませんSystem.getProperties
。)
個人的には、文字セット名またはCharset
. 実際にシステムのデフォルトを使用したい場合がまれにありますが、それを明示的に指定するだけです (例: を使用Charset.defaultCharset
)。
の JavaDoc getBytes()
:
プラットフォームのデフォルトの文字セットを使用して、この文字列を一連のバイトにエンコードし、結果を新しいバイト配列に格納します。
MattBall が言ったように、 を使用するたびに文字セットを定義するのが最善getBytes(Charset charset)
です。
質問1の答え:それを使えば世界は滅びないので安全です。ただし、バイトを取得したい場合は、使用する文字エンコーディングを指定するオーバーロードを使用する限り、安全に使用できます。
質問 2 への回答: 適切に処理を進め、優先する文字エンコーディング (UTF-8) を指定した場合、特別なことは何もありません。
質問 3 への回答: 文字は異なる文字エンコーディングで異なる方法でエンコードされるため、数値表現が使用される文字エンコーディングに大きく依存するのは当然です。したがって、より多くの文字エンコーディングを使用している場合、同じメッセージに対して異なるバイト配列を取得する可能性があります。このため、文字エンコーディングを指定することを強くお勧めします。このような問題は発生しません。
質問 4 への回答: 可能なはずですが、私は Java 1.4 のユーザーではないため、これをテストすることはできません。
安全に使用でき
String.getBytes()
ますか?
状況によっては、はい。たとえば、文字列のエンコードされた形式が現在のホストでのみ使用されることがわかっている場合、(おそらく) 安全です。
プログラムが異なるデフォルト文字セットを持つ異なるシステムで実行されるとどうなりますか?
場合によります:
文字列が異なる文字セット間で同じエンコーディングの文字のみを含む場合、何も問題はありません。たとえば、単純な (ローマ字の) 文字と数字、および「通常の」句読点のみを使用する場合、デフォルトの文字セットが ASCII、LATIN-1、または UTF-8 のいずれであっても問題ありません。
エンコードされた文字列データが同じシステムで作成され、消費される場合は、問題ありません。
データが交換されている場合にのみ問題になります。その場合、間違ったエンコーディングを使用することになり、エンコードされた文字がデコードされるときに文字化けが発生する可能性があります。
別のコンテンツバイト [] を取得できると思いますか? Java 1.4で優先文字セットを定義することは可能ですか?
コンテンツのエンコーディングをデフォルトのエンコーディングとは異なるものにする必要があることがわかっている場合は、byte[] getBytes(Charset charset)
またはを使用する必要がありますbyte[] getBytes(String charsetName)
。