Javaの文字エンコーディングの分析

この記事では、最初から問題について実際にある:Javaのchar型は漢字でそれを保存することができますか?

UTF-8エンコーディング

UTF-8は、インターネット上でUnicodeを使用して最も広く使用されている実装です。他の実装は、さらに、実質的にはないインターネット上で、UTF-16(文字2バイトまたは4バイト)、およびUTF-32(文字で表される4バイト)を含みます。繰り返しますが、ここで関係、UTF-8 Unicodeは、実装の一つです。UTF-8の最大の特徴は、可変長符号化であるということです。これは、バイト長がシンボルによって異なり、一つのシンボルの1〜4バイトであることができます。
UTF-8エンコーディング規則は、2つだけの非常にシンプルです。

単一バイトシンボルの1は、最初のバイトは、バック7シンボルコードのユニコードに、0に設定されています。そのため、英語のアルファベットのため、UTF-8エンコーディングとASCIIコードは同じです。
2.がNバイト(N> 1)の符号について、最初のバイトの最初のnビットが1に設定され、N + 1ビットが0に設定され、後の最初の2つのバイトが均一セット10。残りのビットは、全てこのUnicodeコードシンボルを言及していません。
次の表は、符号化規則をまとめたもので、文字xは、ビットを符号化する利用可能表します。

Unicodeのシンボル範囲(16進数) UTF-8エンコーディング(バイナリ)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxxに
0000 0800-0000 FFFF 1110xxxx 10xxxxxxに10xxxxxxに
0001 0000-0010 FFFF 11110xxx 10xxxxxxに10xxxxxxに10xxxxxxに

これは、UTF-8エンコーディングを読んだことは非常に簡単で、テーブルの上に今あります。最初のバイトが0である場合、これはシングルバイト文字であり、最初のビットが1の場合は、連続した1の数が、それは現在の文字によって占有バイト数を示します。
以下は、中国語の文字に「厳しい」とは、例えば、UTF-8エンコーディングを実装する方法を示します。
「厳格な」Unicodeは4E25(100111000100101)で知られ、表によれば、4E25第三列の範囲に見出すことができる(0000 0800から0000 FFFF)ので、「厳密な」UTF-8エンコーディングは、3つのバイトを必要としますフォーマットは「1110xxxx 10xxxxxxに10xxxxxxに」です。次に、「厳格な」最後のビットスタートから、前に戻ってから、xの形式で記入し、余分のビット0。これは16進数に変換し、「厳密な」UTF-8エンコーディングされた「11100100 1,011,100,010,100,101」をもたらしE4B8A5あります。

UTF-16エンコーディング

UnicodeのUTF-16は、一の実施形態で使用されています。UTFはフォーマットとして動作するようにユニコードの意味でのUnicode TransferFormat、です。UTF-8よりもUTF-16文字のバイト(2バイト)は、固定長さを格納することの利点のほとんどが、ASCIIのUTF-16との互換性がないことができます。UTF-16の記憶形式の大小端部が使用されています。ファイルの終端UTF-16のサイズを明確にするためには、UTF-16ファイルの先頭では、の文字​​U + FEFFバイトオーダーマーク(UTF-16LE FF FEの代表者に、UTFの16BE-にFE FF代表)として配置されますテキストファイルには、名前が示すように、それはノー幅とノーハイフネーション空白になって、U + FEFF Unicode文字の意味はZERO WIDTH NO-BREAK SPACEの中で表現されUTF-16コードを、表示されています。

説明する例

例1

1 
2
3
4
5
6
7
8
9
10
11
12
文字列s =「私は李博玉よ」。
バイト[] CHARARR = s.getBytes(Charset.forName( "UTF-16"));
(バイトB:CHARARR)用{
System.out.printf( "%のX"、B)。
}
のSystem.out.println(s.getBytes(Charset.forName( "UTF-16"))の長さ。)。

CHARARR = s.getBytes(Charset.forName( "UTF-8"));
(バイトB:CHARARR)用{
System.out.printf( "%のX"、B)。
}
のSystem.out.println(s.getBytes(Charset.forName( "UTF-8"))の長さ。)。

出力結果は、それがどのようなものですか?
FF 49 0 27 0 FE 6D 0 0 67 4E 20 73であるが53である。(a)89
16
49 27 6D 20が8Dである。9A E5 E6 E7 8E 9D 89 8E
13れます

なぜコーディング1.UTF-16は16ですか?
話すの文字のほとんどは、UTF-16は、ストアに2つのバイトを使用しています。しかし、UTF-16は、支持体側の大きさで、最初の文字にFE FF表示ビッグエンディアンのストレージをその良いエンディアンの2つのバイトを追加スペースを指定する必要があります。
7×2 + 2 = 16
符号化がある理由2.UTF-8 13?
UTF-8は、ASCII符号化と完全な互換性があり、それは中国の最も3つのバイトではなく、一般的な4バイト、英語で1バイトで
4 + 3×3 = 13

例2

文字列S1 =「李」。
文字列s2 =「
のSystem.out.println(s1.length())。
System.out.println(s2.length())。

出力結果は、それがどのようなものですか?
1
2は
、この結果がどのように問題最後に、崩壊していない参照してください?

1 .LENGTHが意味するものを理解する最初のものは、文字列の内部char配列の形で格納され、.LENGTHはchar配列の長さを指し、文字は、UTF-16は、リーが一般的に使用される単語、UTF-16エンコーディングでエンコードされ2バイトの後に、長さが1になるようにしながら、文字を格納することが可能であるUTF-16は4バイト、格納された2つの文字の総数をコードする、長さが2であります

オリジナル:ビッグボックス  のjava文字エンコーディング分析


おすすめ

転載: www.cnblogs.com/chinatrump/p/11597139.html