byte[]トランスString、符号化と文字化の問題、Base 64符号化
まずよく使われるbyte[]直接Stringは簡単です.
たとえば、上記のように、出力された結果は次のとおりです.
ではjavaでは文字符号化をどのように処理していますか?これは規範が必要です
JAVAは独自のStringクラスを使用しており、Stringクラスオブジェクトはエンコードテーブルを指定する必要はありません!なぜ、数字の山がそれぞれどんな文字を表しているかを自分で知っているのでしょうか.Stringの文字情報はUNICコードコードで保存されているからです.JAVAは文字を表すためにcharというデータ型もあり、その大きさは2つの8ビット16進数の長さ、つまり0~65535に固定されている.ユニコードの文字に対応しています.皆さんがStringのUNICodeを押す数字を取りたい場合は、getChars(int src Begin,int src End,char[]dst,int dstBegin)法でchar[]を取得することができます.このchar[]にはString文字を表すUNICode符号表で符号化された数字が含まれています.
なぜbyte[]回転Stringがまた文字化けしてしまうのですか?
明らかに、上述したように、符号化仕様が異なる.栗を挙げると、例えばGB 2312の規範的な中国語の「当」の字は、0 xB 5、0 xB 1という2つの8桁の数字で表されています.英語システムでは、GB 2312のコードテーブルがなく、0 xB 5,0 xB 1を与えて、彼は馬鹿にASCIIとして処理した.Javaに入れると、彼はまた自分のUNICOD規範に従って処理するので、規範が違うと、奇妙な結果、つまり文字化けしてしまいます.
では、byte[]回転Stringの文字化けし問題をどう解決すればいいのでしょうか.
byte[]がどこから来たのか見なければなりません.1枚の画像をbyte[]に変換してStringストリームオブジェクトに変換して別の場所に転送し、受信者がbyte[]に変換して画像になることがよくあります.
①シーケンス化を推奨する人もいるが,これも一つの案であるが,具体的な実施はまだ検討されていない.
②byte[]を直接転送するとbyte[]が長すぎてデータが失われます.すべてのbyteの組み合わせがcharにマッピングできるわけではないので
③では、よくあるBase 64コード仕様を使いましょう.base 64の符号化仕様は、一般的な文字を6ビットバイナリ表現に変換すること(よく64個使うのでbase 64と呼ぶでしょう).どのように書きますか.既製のツール類がありますよ.以下のようにします.
知識は蓄積することが大切だ.
補足base 64符号化説明:
Base 64符号化は、3つの8ビットバイト(3*8=24)を4つの6ビットバイト(4*6=24)に変換し、その後、6ビットの前に2つの0を補い、8ビットの1バイトの形式を形成することを要求する.残りの文字が3バイト未満の場合は0で埋め、出力文字は'='を使用するため、符号化後に出力されるテキストの末尾に1または2つの'='が現れる可能性があります.
Base 64は、出力される符号化ビット可読文字を保証するために、統一変換のための符号化テーブルを作成する.符号化テーブルのサイズは2^6=64であり、これもBase 64名の由来である.
コード値
文字
コード値
文字
コード値
文字
コード値
文字
0
A
16
Q
32
g
48
w
1
B
17
R
33
h
49
x
2
C
18
S
34
i
50
y
3
D
19
T
35
j
51
z
4
E
20
U
36
k
52
0
5
F
21
V
37
l
53
1
6
G
22
W
38
m
54
2
7
H
23
X
39
n
55
3
8
I
24
Y
40
o
56
4
9
J
25
Z
41
p
57
5
10
K
26
a
42
q
58
6
11
L
27
b
43
r
59
7
12
M
28
c
44
s
60
8
13
N
29
d
45
t
61
9
14
O
30
e
46
u
62
+
15
P
31
f
47
v
63
/
public static void main(String[] args) {
String str=" ";
byte[] arr=str.getBytes();
System.out.println(" :"+arr);
for(byte e : arr) {
System.out.print(e + " ");
}
String str2=new String(arr);
System.out.println("
2:"+str2);
}
たとえば、上記のように、出力された結果は次のとおりです.
:[B@15db9742
-50 -46 -54 -57 -42 -48 -71 -6 -56 -53
2:
これを見るとコードがわかります.byteは1バイト、漢字は2バイトです.だから5つの漢字は10 byteタイプの数字で保存します.そして数字が漢字になり、その間に符号化規範が進む過程である.ではjavaでは文字符号化をどのように処理していますか?これは規範が必要です
JAVAは独自のStringクラスを使用しており、Stringクラスオブジェクトはエンコードテーブルを指定する必要はありません!なぜ、数字の山がそれぞれどんな文字を表しているかを自分で知っているのでしょうか.Stringの文字情報はUNICコードコードで保存されているからです.JAVAは文字を表すためにcharというデータ型もあり、その大きさは2つの8ビット16進数の長さ、つまり0~65535に固定されている.ユニコードの文字に対応しています.皆さんがStringのUNICodeを押す数字を取りたい場合は、getChars(int src Begin,int src End,char[]dst,int dstBegin)法でchar[]を取得することができます.このchar[]にはString文字を表すUNICode符号表で符号化された数字が含まれています.
なぜbyte[]回転Stringがまた文字化けしてしまうのですか?
明らかに、上述したように、符号化仕様が異なる.栗を挙げると、例えばGB 2312の規範的な中国語の「当」の字は、0 xB 5、0 xB 1という2つの8桁の数字で表されています.英語システムでは、GB 2312のコードテーブルがなく、0 xB 5,0 xB 1を与えて、彼は馬鹿にASCIIとして処理した.Javaに入れると、彼はまた自分のUNICOD規範に従って処理するので、規範が違うと、奇妙な結果、つまり文字化けしてしまいます.
では、byte[]回転Stringの文字化けし問題をどう解決すればいいのでしょうか.
byte[]がどこから来たのか見なければなりません.1枚の画像をbyte[]に変換してStringストリームオブジェクトに変換して別の場所に転送し、受信者がbyte[]に変換して画像になることがよくあります.
①シーケンス化を推奨する人もいるが,これも一つの案であるが,具体的な実施はまだ検討されていない.
②byte[]を直接転送するとbyte[]が長すぎてデータが失われます.すべてのbyteの組み合わせがcharにマッピングできるわけではないので
③では、よくあるBase 64コード仕様を使いましょう.base 64の符号化仕様は、一般的な文字を6ビットバイナリ表現に変換すること(よく64個使うのでbase 64と呼ぶでしょう).どのように書きますか.既製のツール類がありますよ.以下のようにします.
import org.apache.commons.codec.binary.Base64;
public class UtilHelper {
//base64 byte[]
public static byte[] base64String2ByteFun(String base64Str){
return Base64.decodeBase64(base64Str);
}
//byte[] base64
public static String byte2Base64StringFun(byte[] b){
return Base64.encodeBase64String(b);
}
}
これによりbyte[]とString間の標準変換が保証され、ネットワーク転送時にも予期せぬ事故は発生しません.勉強しましょう.知識は蓄積することが大切だ.
補足base 64符号化説明:
Base 64符号化は、3つの8ビットバイト(3*8=24)を4つの6ビットバイト(4*6=24)に変換し、その後、6ビットの前に2つの0を補い、8ビットの1バイトの形式を形成することを要求する.残りの文字が3バイト未満の場合は0で埋め、出力文字は'='を使用するため、符号化後に出力されるテキストの末尾に1または2つの'='が現れる可能性があります.
Base 64は、出力される符号化ビット可読文字を保証するために、統一変換のための符号化テーブルを作成する.符号化テーブルのサイズは2^6=64であり、これもBase 64名の由来である.
Base 64エンコーディングテーブル
コード値
文字
コード値
文字
コード値
文字
コード値
文字
0
A
16
Q
32
g
48
w
1
B
17
R
33
h
49
x
2
C
18
S
34
i
50
y
3
D
19
T
35
j
51
z
4
E
20
U
36
k
52
0
5
F
21
V
37
l
53
1
6
G
22
W
38
m
54
2
7
H
23
X
39
n
55
3
8
I
24
Y
40
o
56
4
9
J
25
Z
41
p
57
5
10
K
26
a
42
q
58
6
11
L
27
b
43
r
59
7
12
M
28
c
44
s
60
8
13
N
29
d
45
t
61
9
14
O
30
e
46
u
62
+
15
P
31
f
47
v
63
/