22
public class UTF8 {
    public static void main(String[] args){
        String s = "ヨ"; //0xFF6E
        System.out.println(s.getBytes().length);//length of the string
        System.out.println(s.charAt(0));//first character in the string
    }
}

出力:

3
ヨ

これを理解するのを手伝ってください。utf8エンコーディングがJavaでどのように機能するかを理解しようとしています。charcharのjavadoc定義によると、 charデータ型は単一の16ビットUnicode文字です。

Javaのchar型は、2バイトでそれ以下で表現できるUnicode文字のみをサポートできるということですか?

上記のプログラムでは、その文字列に割り当てられたバイト数は3ですが、最初の文字(Javaでは2バイト)を返す3行目では、3バイトの長さの文字を保持できますか?ここで本当に混乱していますか?

java/generalでのこの概念に関する良い参考資料をいただければ幸いです。

4

4 に答える 4

34
于 2012-08-29T23:27:41.557 に答える
4

String.getBytes()内部表現と一致する必要のないプラットフォームのデフォルトの文字エンコードを使用してバイトを返します。

ほとんどの場合、プラットフォームのデフォルトのエンコーディングに依存することは意味がないため、ほとんどの場合、この方法を使用しないことをお勧めします。代わりに使用String.getBytes(String charsetName)し、文字列をバイトにエンコードするために使用する文字セットを明示的に指定します。

于 2012-08-29T23:10:45.413 に答える
3

UTF-8は可変長エンコーディングであり、ASCII文字(0〜127の値)には1バイトのみを使用し、他のUnicodeシンボルには2、3(またはそれ以上)バイトを使用します。

これは、バイトの上位ビットが「これはマルチバイトシーケンスです」を示すために使用されるため、8の1ビットは実際に「実際の」データ(文字コード)を表すためではなく、バイトをマークするために使用されます。

したがって、Javaが各文字にRAMで2バイトを使用しているにもかかわらず、文字がUTF-8を使用して「シリアル化」されると、結果のバイト配列に1、2、または3バイトが生成される場合があります。これがUTF-8エンコーディングの仕組みです。

于 2012-08-29T23:07:22.543 に答える
3

これは、Javaが文字を表す方法です。

于 2012-08-29T23:09:51.430 に答える