2017-03-10 9 views
0

私は中国語の文字を処理するJavaどのようにテストするには、以下のプログラムを持っている:なぜ中国語の文字は1文字(2バイト)で3バイトかかりますか?

エンコーディング= UTF-8、世界您好のchar []の長さ= 4:

String s3 = "世界您好"; 
char[] chs = s3.toCharArray(); 
byte[] bs = s3.getBytes(StandardCharsets.UTF_8); 
byte[] bs2 = new String(chs).getBytes(StandardCharsets.UTF_8); 

System.out.println("encoding=" + Charset.defaultCharset().name() + ", " + s3 + " char[].length=" + chs.length 
       + ", byte[].length=" + bs.length + ", byte[]2.length=" + bs2.length); 

プリントアウトはこれです。、バイト[]の長さ= 12、バイト[] 2.length = 12

結果これらは、次のとおり

  1. 中国語の文字を保持するのにchar[]が使用されている場合、1つの中国語の文字がchar(Javaでは2バイト)をとります。

  2. 漢字を保持するのにbyte[]が使用されている場合、1つの中国語文字が3 byteになります。

私の質問は、2バイトで十分な場合、3バイトを使用する理由ですか? 2バイトで十分でない場合、なぜ2バイトを使用するのですか?

EDIT:

私のJVMのデフォルトエンコーディングがUTF-8に設定されています。

+0

異なるエンコードを使用しています。あなたはそれらの文字のバイトを取るだけではありません。 –

+1

UTF-8エンコーディングは、1文字につき最大4バイトまで使用できます。 https://en.wikipedia.org/wiki/UTF-8を参照してください。 –

+0

すばらしいテキストエンコーディングの世界へようこそ。 –

答えて

0

Javaのchar型は、データを格納するためにすべてのビットを使用して、16バイトのデータを2バイトオブジェクトに格納します。 UTF-8はこれをしません。中国語文字の場合、UTF-8は各バイトの6ビットのみを使用してデータを格納します。他の2ビットは制御情報を含む。 ASCII文字の場合、UTF-8は7ビットを使用します。これは複雑なエンコーディングの仕組みですが、UTF-8に最大32ビットの文字を格納することができます。これには、7ビット(ASCII)文字に対して1文字あたり1バイトしか取らず、ASCIIと下位互換性があるという利点があります。しかし、16ビットのデータを格納するには3バイトが必要です。あなたはそれがWikipediaでそれを見ることによってどのように動作するかを知ることができます。

関連する問題