java轉(zhuǎn)換字符串編碼格式 (解碼錯誤,重新解碼)
字符集概念:規(guī)定了某個文字對應的二進制數(shù)字存放方式(編碼)和某串二進制數(shù)值代表了哪個文字(解碼)的轉(zhuǎn)換關(guān)系。
我們在計算機屏幕上看到的是實體化的文字,而在計算機存儲介質(zhì)中存放的實際是二進制的比特流。
亂碼場景(純屬瞎掰):
1) 前臺輸入utf-8編碼的一串漢字(string1)。 (頁面編碼為utf-8, 在內(nèi)存中會將這串漢字以utf-8編碼為對應的二進制流存儲)
2) 這串漢字(string1)的二進制流在經(jīng)過http協(xié)議傳輸?shù)胶笈_時,這段比特流會被以iso-8859-1編碼強行解碼為字符串(string2)。
(2.1 http默認編碼格式為iso-8859-1)
(2.2 這個默認編碼在什么時候起作用呢? 應該是在到達tomcat之后, 到達servlet之前, tomcat對request請求強行使用iso-8859-1進行了解碼)
(2.3 有什么辦法阻止tomcat對request請求強行iso-8859-1解碼呢?
apache-tomcat\conf\server.xml中添加uriencoding="utf-8"配置即可,還是來個圖吧)
3) 在后臺(servlet)接收字符串(string2)時毫無疑問的亂碼了。
) 這時需要將接收到的字符串(string2)根據(jù)iso-8859-1編碼重新轉(zhuǎn)換為byte流。再將byte流根據(jù)utf-8編碼重新解碼為字符串(sting3)。
5) 這時的字符串(string3)和前臺的字符串(string1)是對應同一個二進制流,并且使用的是同一種編碼。也就不會亂碼了。
亂碼的另一種解決辦法:
request.setcharacterencoding("utf-8"),這句話熟悉么,這句話的意思是:用"utf-8"編碼對客戶端的請求進行重新解碼。
在步驟2之后(或步驟3中)執(zhí)行,那么接收到的參數(shù)也不會亂碼啦。
一個小例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import java.io.unsupportedencodingexception; public class convertencodingformat { /** * 將一段錯誤解碼的字符串重新解碼 */ public static string convertencodingformat(string str, string formatfrom, string formatto) { string result = null ; if (!(str == null || str.length() == 0 )) { try { result = new string(str.getbytes(formatfrom), formatto); } catch (unsupportedencodingexception e) { e.printstacktrace(); } } return result; } /** * test */ public static void main(string[] args) { // utf-8編碼 string str = "你好,少年!" ; // utf-8編碼的byte流強行用iso-8859-1解碼,毫無疑問的亂碼了 string str1 = convertencodingformat(str, "utf-8" , "iso-8859-1" ); system.out.println(str1); // 將str1再轉(zhuǎn)化為byte流,重新用utf-8解碼,亂碼問題解決 string str2 = convertencodingformat(str1, "iso-8859-1" , "utf-8" ); system.out.println(str2); } } |
java字符串的各種編碼轉(zhuǎn)換
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
import java.io.unsupportedencodingexception; /** * 轉(zhuǎn)換字符串的編碼 */ public class changecharset { /** 7位ascii字符,也叫作iso646-us、unicode字符集的基本拉丁塊 */ public static final string us_ascii = "us-ascii" ; /** iso 拉丁字母表 no.1,也叫作 iso-latin-1 */ public static final string iso_8859_1 = "iso-8859-1" ; /** 8 位 ucs 轉(zhuǎn)換格式 */ public static final string utf_8 = "utf-8" ; /** 16 位 ucs 轉(zhuǎn)換格式,big endian(最低地址存放高位字節(jié))字節(jié)順序 */ public static final string utf_16be = "utf-16be" ; /** 16 位 ucs 轉(zhuǎn)換格式,little-endian(最高地址存放低位字節(jié))字節(jié)順序 */ public static final string utf_16le = "utf-16le" ; /** 16 位 ucs 轉(zhuǎn)換格式,字節(jié)順序由可選的字節(jié)順序標記來標識 */ public static final string utf_16 = "utf-16" ; /** 中文超大字符集 */ public static final string gbk = "gbk" ; /** * 將字符編碼轉(zhuǎn)換成us-ascii碼 */ public string toascii(string str) throws unsupportedencodingexception{ return this .changecharset(str, us_ascii); } /** * 將字符編碼轉(zhuǎn)換成iso-8859-1碼 */ public string toiso_8859_1(string str) throws unsupportedencodingexception{ return this .changecharset(str, iso_8859_1); } /** * 將字符編碼轉(zhuǎn)換成utf-8碼 */ public string toutf_8(string str) throws unsupportedencodingexception{ return this .changecharset(str, utf_8); } /** * 將字符編碼轉(zhuǎn)換成utf-16be碼 */ public string toutf_16be(string str) throws unsupportedencodingexception{ return this .changecharset(str, utf_16be); } /** * 將字符編碼轉(zhuǎn)換成utf-16le碼 */ public string toutf_16le(string str) throws unsupportedencodingexception{ return this .changecharset(str, utf_16le); } /** * 將字符編碼轉(zhuǎn)換成utf-16碼 */ public string toutf_16(string str) throws unsupportedencodingexception{ return this .changecharset(str, utf_16); } /** * 將字符編碼轉(zhuǎn)換成gbk碼 */ public string togbk(string str) throws unsupportedencodingexception{ return this .changecharset(str, gbk); } /** * 字符串編碼轉(zhuǎn)換的實現(xiàn)方法 * @param str 待轉(zhuǎn)換編碼的字符串 * @param newcharset 目標編碼 * @return * @throws unsupportedencodingexception */ public string changecharset(string str, string newcharset) throws unsupportedencodingexception { if (str != null ) { //用默認字符編碼解碼字符串。 byte [] bs = str.getbytes(); //用新的字符編碼生成字符串 return new string(bs, newcharset); } return null ; } /** * 字符串編碼轉(zhuǎn)換的實現(xiàn)方法 * @param str 待轉(zhuǎn)換編碼的字符串 * @param oldcharset 原編碼 * @param newcharset 目標編碼 * @return * @throws unsupportedencodingexception */ public string changecharset(string str, string oldcharset, string newcharset) throws unsupportedencodingexception { if (str != null ) { //用舊的字符編碼解碼字符串。解碼可能會出現(xiàn)異常。 byte [] bs = str.getbytes(oldcharset); //用新的字符編碼生成字符串 return new string(bs, newcharset); } return null ; } public static void main(string[] args) throws unsupportedencodingexception { changecharset test = new changecharset(); string str = "this is a 中文的 string!" ; system.out.println( "str: " + str); string gbk = test.togbk(str); system.out.println( "轉(zhuǎn)換成gbk碼: " + gbk); system.out.println(); string ascii = test.toascii(str); system.out.println( "轉(zhuǎn)換成us-ascii碼: " + ascii); gbk = test.changecharset(ascii,changecharset.us_ascii, changecharset.gbk); system.out.println( "再把ascii碼的字符串轉(zhuǎn)換成gbk碼: " + gbk); system.out.println(); string iso88591 = test.toiso_8859_1(str); system.out.println( "轉(zhuǎn)換成iso-8859-1碼: " + iso88591); gbk = test.changecharset(iso88591,changecharset.iso_8859_1, changecharset.gbk); system.out.println( "再把iso-8859-1碼的字符串轉(zhuǎn)換成gbk碼: " + gbk); system.out.println(); string utf8 = test.toutf_8(str); system.out.println( "轉(zhuǎn)換成utf-8碼: " + utf8); gbk = test.changecharset(utf8,changecharset.utf_8, changecharset.gbk); system.out.println( "再把utf-8碼的字符串轉(zhuǎn)換成gbk碼: " + gbk); system.out.println(); string utf16be = test.toutf_16be(str); system.out.println( "轉(zhuǎn)換成utf-16be碼:" + utf16be); gbk = test.changecharset(utf16be,changecharset.utf_16be, changecharset.gbk); system.out.println( "再把utf-16be碼的字符串轉(zhuǎn)換成gbk碼: " + gbk); system.out.println(); string utf16le = test.toutf_16le(str); system.out.println( "轉(zhuǎn)換成utf-16le碼:" + utf16le); gbk = test.changecharset(utf16le,changecharset.utf_16le, changecharset.gbk); system.out.println( "再把utf-16le碼的字符串轉(zhuǎn)換成gbk碼: " + gbk); system.out.println(); string utf16 = test.toutf_16(str); system.out.println( "轉(zhuǎn)換成utf-16碼:" + utf16); gbk = test.changecharset(utf16,changecharset.utf_16le, changecharset.gbk); system.out.println( "再把utf-16碼的字符串轉(zhuǎn)換成gbk碼: " + gbk); string s = new string( "中文" .getbytes( "utf-8" ), "utf-8" ); system.out.println(s); } } |
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/H12KJGJ/article/details/68065637