2017-10-31 4 views
2

以下のプログラムについては、デフォルトの文字セット - Javaの

package io.buffer; 

import java.nio.charset.Charset; 

public class TestCharSet { 

    public static void main(String[] args) { 
     // Print the default Charset 
     System.out.println("The default charset is: " + Charset.defaultCharset()); 

    } 

} 

ファイルのエンコーディングのデフォルトの文字セットは、システムプロパティfile.encodingに保たれています。ファイルエンコーディングのJVMのデフォルトの文字セットを変更するには、コマンドラインVMオプション-Dfile.encodingを使用します。

の引数を持つプログラム:

> java -Dfile.encoding=UTF-8 TestCharSet 

は出力が得られます。

The default charset is: UTF-8 

の引数を持つプログラム:

> java -Dfile.encoding=ascii TestCharSet 

は出力が得られます。

The default charset is: US-ASCII 

なぜjava -Dfile.encoding=UTF-16 TestCharSetが出力��を出力するのですか?

+0

それは出力全体ですか?その2人のキャラクターだけ? –

+0

@TedHoppはい。出力全体はちょうどそれらの2文字です – overexchange

+0

このように見て、3つのプログラムはシェル/ターミナル/プロンプトから実行され、それぞれが異なるエンコーディングを使用して出力するように指示しています。シェルのエンコーディングが同じに保たれていると仮定すると、実行の少なくとも2つ、おそらくすべてが間違っています。 @TedHoppが示唆しているように出力をファイルにパイプすると、それぞれがエンコードを知っているテキストファイルを生成するので、それらは正しくなります。 (大きな問題は、どうしてデフォルトのエンコーディングを使いこなすのですか?) –

答えて

4

私は-Dfile.encoding=UTF-16で私のMac上のあなたのプログラムを実行すると、私は(16進ダンプなど)次のような出力が得られます。

0000000 fe ff 00 54 00 68 00 65 00 20 00 64 00 65 00 66 
0000020 00 61 00 75 00 6c 00 74 00 20 00 63 00 68 00 61 
0000040 00 72 00 73 00 65 00 74 00 20 00 69 00 73 00 3a 
0000060 00 20 00 55 00 54 00 46 00 2d 00 31 00 36 00 0a 

だから何はおそらくあなたとされて起こっている:UTF-16の原因にfile.encodingを設定しますJavaはコンソールにUTF-16シーケンスを書き込み、コンソールはUTF-16出力を処理するように設定されていません。最初の2バイト(一緒にUnicode BYTE ORDER MARKを形成する)は正しく表示されません(おそらく、コンソールフォントやドライバのため)、残りの出力は最初のヌルバイトで切り捨てられます。

プログラムの出力をファイルに書き出し、16進エディタなどで見てみると、何が起こっているのかが分かりやすくなります。

+0

'fe ff'はBOMマーカーです.Eclipse IDEコンソールを使用しています。端末上で、コード '〜/ eclipse-workspace/IO/src/io/buffer $ java -classpathを実行できません。 'Error:メインクラスTestCharSetを見つけられない、ロードできませんでした。 ' – overexchange

+0

@overexchange - 私はそれを言ったと思います。 ( "BOM"は "バイトオーダーマーク"の頭字語です)エラーについては、OPのコードから 'package'宣言を取り除き、コマンドラインからこれを実行したい場合は' .class' '。/ io/buffer'フォルダにあるファイルを開き、' java -classpath 'というコマンドラインを使います。 io.buffer.TestCharSet'です。 –

+0

@overexchange - はい、サブフォルダ 'io/buffer'からはアクセスできません。 Javaはクラスパス上のいくつかのフォルダからサブフォルダ 'io/buffer'を探します。現在のディレクトリがサブフォルダで、 '-classpath .'を使用している場合、それは見つからないでしょう。おそらく、あなたが 'io/buffer'に入っていれば、' -cp ../ .. 'を使うことができます。私はそれを試していない。 –

関連する問題