本文目錄一覽:
- 1、如何解決JavaEE開發中字元編碼出現亂碼問題
- 2、java中編碼與解碼分別指什麼?
- 3、JAVA 字元串 位元組 編碼問題 高手來
- 4、如何解決Java中的中文亂碼問題
- 5、如何解決java編譯時編碼問題造成的錯誤
- 6、java後台怎麼解決編碼問題
如何解決JavaEE開發中字元編碼出現亂碼問題
1、瀏覽器調用jsp,html等頁面中文顯示亂碼
此情況需滿足兩個要求:
(1)文件本身是以utf-8編輯保存的(myEclipse中在properties中滑鼠右鍵選擇utf-8)
(2)瀏覽器用utf-8解析:
(手動)== 在瀏覽器中右鍵選擇編碼格式為utf-8
(智能)== 在文件中寫入如: meta name=”content-type” content=”text/html; charset=UTF-8″ 通過meta標籤模擬response頭,起到告訴瀏覽器用utf-8的編碼解析
(智能)== response.setContentType(“text/html;charset=UTF-8”);起到告訴瀏覽器用utf-8的編碼解析
常用:
meta name=”content-type” content=”text/html; charset=UTF-8″或meta charset=”utf-8″
%@ pageEncoding=”utf-8″%
?xml encoding=”UTF-8″?
2、通過瀏覽器調用servlet,頁面顯示亂碼。
Servlet亂碼分為request亂碼和response亂碼;
(1)response亂碼問題
解決方法:
在網上很有效的解決方法是添加:
response.setCharacterEncoding(“UTF-8”);
解決不了,後來又搜到一條解決方法是:
response.setContentType(“text/html;charset=utf-8”);或者 response.setHeader(“content-type”,”text/html;charset=UTF-8″);告訴瀏覽器用utf-8解析。(setHeader是HttpServletResponse的方法。如果想在攔截器Filter中設置字元編碼,則無此方法,因為Filter的doFilter方法的參數類型是ServletResponse)
兩句都填上,後來終於解決了這個問題;
其實我們應該思考一下本質:
response.setContentType(“text/html;charset=UTF-8”); 目的是為了控制瀏覽器的行為,即控制瀏覽器用UTF-8進行解碼;
response.setCharacterEncoding(“UTF-8”);目的是用於response.getWriter()輸出的字元流的亂碼問題。如果是response.getOutputStream()是不需要此種解決方案的,因為這句話的意思是為了將response對象中的數據以UTF-8解碼後的位元組流發向瀏覽器;
java中編碼與解碼分別指什麼?
java中編碼:URLEncoder.encode(strUri,”utf-8″);
java中解碼碼:URLDecoder.decode(strUri,”utf-8″);
java編碼和解碼
流讀取文件,具有轉換編碼功能的有:OutputStreamWriter和InputStreamReader,
構造器有如:
InputStreamReader(InputStream in, String charsetName)
創建使用指定字符集的 InputStreamReader。
OutputStreamWriter(OutputStream out, String charsetName)
創建使用指定字符集的 OutputStreamWriter。
處理字元串編碼問題:
重新對獲取的字元串進行編碼:Byte[] bytes = str.getBytes(String encodeCharsetNam);
重新對bytes進行解碼,創建新的字元串對象:str = new String(Byte[] bytes,String decodeCharsetName);
一般結合使用:str = new String(str.getBytes(String encodeCharsetName),String decodeCharsetName);
例如:resultName=new String(username.getBytes(“ISO-8859-1″),”UTF-8”);
還可以加入判斷:
if(!Charset.forName(“gbk”).newEncoder().canEncode(str)){str = new Strin(str.getBytes(“ISO-8859-1″),”UTF-8”);}else{str = new String(str.getBytes(“ISO-8859-1″),”gbk”);}
處理請求參數傳遞編碼問題:
java中編碼:URLEncoder.encode(strUri,”utf-8″);
java中解碼碼:URLDecoder.decode(strUri,”utf-8″);
js中編碼:encodeURIComponent(strUri);encodeURI(strUri);escape(str);
js中解碼:decodeURIComponent(strUri);decodeURI(strUri);unescape(str);
補充概念:
URI組件:主機、埠、路徑、查詢參數、片段等。
URI組件分隔符::/?#[]@,冒號用於分隔協議和主機,/用於分隔主機和 路徑,?用於分隔路徑和查詢參數,用於分隔多個查詢參數等。
URI中的不安全字元或保留字元: ! * 『 ( ) ; : @ = + $ , / ? # [ ] 他們具有特殊作用,例如上面的分隔作用。
URI允許出現的字元:只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元,其他字元均需要經過編碼之後才能出現在Url中,比如使用保留字元的原意,而不是特殊作用。
js向java/jsp的編碼與解碼:
js中編碼:encodeURI(encodeURI(strUri));decodeURIComponent(decodeURIComponent(strUri));
java/jsp中解碼: java.net.URLDecoder.decode(strUri,”UTF-8″);
js中編碼兩次的問題:如果使用一次編碼,在瀏覽器地址欄里,瀏覽器認為%是個轉義字元,瀏覽器會把%與%之間的編碼值,兩位兩位取出後進行解碼。
然後再傳遞給處理頁面,然後由處理頁面進行再次解碼,這樣前面就缺少了一次編碼過程,所以前面需要連續兩次編碼。
JAVA 字元串 位元組 編碼問題 高手來
1.
編程序的時候如果:String
str=”中文”;在存成文件時,需要把這段文字存為數據(每個位元組byte=8bit),即要編碼,按照不同的編碼方式(比如gb2312或者unicode),所以保存文件的時候需要指定編碼,一般編輯器默認跟系統一致。java編譯器,將源程序編碼時,採用的是unicode編碼方式,所以存在class文件中的位元組碼里的中文常量也是unicode的。這是源程序
2.
在程序處理時,你如果想把str=”中文”,以一定的編碼方式變成存儲時的數據(byte數組),就需要str.getBytes(“encoding”),同理,你從文件或者其他地方讀取到數據後,想轉換成字元串,那麼你就要知道他之前是用什麼編碼方式變成的數據,然後用new
String(bytes,
“encoding”)
就可以了。
如何解決Java中的中文亂碼問題
對於Java,由於默認的編碼方式是UNICODE,所以用中文也易出問題,常見的解決是:
String s2 = new String(s1.getBytes(「ISO-8859-1」),」GBK」);
1、utf8解決JSP中文亂碼問題
一般說來在每個頁面的開始處,加入:
%@ page language=”java” contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″%
%@ page language=”java” contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″%
%
request.setCharacterEncoding(“UTF-8”);
%
◆charset=UTF-8的作用是指定JSP向客戶端輸出的編碼方式為「UTF-8」;
◆pageEncoding=”UTF-8″,為了讓JSP引擎能正確地解碼含有中文字元的JSP頁面,這在LINUX中很有效;
◆request.setCharacterEncoding(“UTF-8”);是對請求進行了中文編碼。
有時,這樣仍不能解決問題,還需要這樣處理一下:
String msg = request.getParameter(“message”);
String str=new String(msg.getBytes(“ISO-8859-1″),”UTF-8”);
out.println(st);
如何解決java編譯時編碼問題造成的錯誤
Java源碼文件這些文件可以是任意字元編碼的,在Java的Class文件里存儲的字元串是UTF-8編碼的,所以如果在代碼中有中文字元的話,就會導致亂碼。當然,這只是眾多原因中的一種,所以把編碼設置統一是避免出現亂碼的解決辦法。
工具:
eclipse
方法如下:
點擊window–Preferences
選擇General–WorkSpace,選擇Default(GBK)即可
附:也可以選擇Other,從Other中選擇程序需要的編碼格式。
java後台怎麼解決編碼問題
不用實現和繼承,自己封裝就可以了,想要什麼轉換自己對應封裝方法就可以了,這樣自己用起來也方便點。再往上找了個例子,你看看希望能幫到你!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 轉換格式 */
public static final String UTF_8 = “UTF-8”;
/** 16 位 UCS 轉換格式,Big Endian(最低地址存放高位位元組)位元組順序 */
public static final String UTF_16BE = “UTF-16BE”;
/** 16 位 UCS 轉換格式,Little-endian(最高地址存放低位位元組)位元組順序 */
public static final String UTF_16LE = “UTF-16LE”;
/** 16 位 UCS 轉換格式,位元組順序由可選的位元組順序標記來標識 */
public static final String UTF_16 = “UTF-16”;
/** 中文超大字符集 */
public static final String GBK = “GBK”;
/**
* 將字元編碼轉換成US-ASCII碼
*/
public String toASCII(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, US_ASCII);
}
/**
* 將字元編碼轉換成ISO-8859-1碼
*/
public String toISO_8859_1(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, ISO_8859_1);
}
/**
* 將字元編碼轉換成UTF-8碼
*/
public String toUTF_8(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_8);
}
/**
* 將字元編碼轉換成UTF-16BE碼
*/
public String toUTF_16BE(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_16BE);
}
/**
* 將字元編碼轉換成UTF-16LE碼
*/
public String toUTF_16LE(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_16LE);
}
/**
* 將字元編碼轉換成UTF-16碼
*/
public String toUTF_16(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, UTF_16);
}
/**
* 將字元編碼轉換成GBK碼
*/
public String toGBK(String str) throws UnsupportedEncodingException {
return this.changeCharset(str, GBK);
}
/**
* 字元串編碼轉換的實現方法
*
* @param str
* 待轉換編碼的字元串
* @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;
}
/**
* 字元串編碼轉換的實現方法
*
* @param str
* 待轉換編碼的字元串
* @param oldCharset
* 原編碼
* @param newCharset
* 目標編碼
* @return
* @throws UnsupportedEncodingException
*/
public String changeCharset(String str, String oldCharset, String newCharset)
throws UnsupportedEncodingException {
if (str != null) {
// 用舊的字元編碼解碼字元串。解碼可能會出現異常。
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(“轉換成GBK碼: ” + gbk);
System.out.println();
String ascii = test.toASCII(str);
System.out.println(“轉換成US-ASCII碼: ” + ascii);
gbk = test.changeCharset(ascii, ChangeCharset.US_ASCII,
ChangeCharset.GBK);
System.out.println(“再把ASCII碼的字元串轉換成GBK碼: ” + gbk);
System.out.println();
String iso88591 = test.toISO_8859_1(str);
System.out.println(“轉換成ISO-8859-1碼: ” + iso88591);
gbk = test.changeCharset(iso88591, ChangeCharset.ISO_8859_1,
ChangeCharset.GBK);
System.out.println(“再把ISO-8859-1碼的字元串轉換成GBK碼: ” + gbk);
System.out.println();
String utf8 = test.toUTF_8(str);
System.out.println(“轉換成UTF-8碼: ” + utf8);
gbk = test.changeCharset(utf8, ChangeCharset.UTF_8, ChangeCharset.GBK);
System.out.println(“再把UTF-8碼的字元串轉換成GBK碼: ” + gbk);
System.out.println();
String utf16be = test.toUTF_16BE(str);
System.out.println(“轉換成UTF-16BE碼:” + utf16be);
gbk = test.changeCharset(utf16be, ChangeCharset.UTF_16BE,
ChangeCharset.GBK);
System.out.println(“再把UTF-16BE碼的字元串轉換成GBK碼: ” + gbk);
System.out.println();
String utf16le = test.toUTF_16LE(str);
System.out.println(“轉換成UTF-16LE碼:” + utf16le);
gbk = test.changeCharset(utf16le, ChangeCharset.UTF_16LE,
ChangeCharset.GBK);
System.out.println(“再把UTF-16LE碼的字元串轉換成GBK碼: ” + gbk);
System.out.println();
String utf16 = test.toUTF_16(str);
System.out.println(“轉換成UTF-16碼:” + utf16);
gbk = test.changeCharset(utf16, ChangeCharset.UTF_16LE,
ChangeCharset.GBK);
System.out.println(“再把UTF-16碼的字元串轉換成GBK碼: ” + gbk);
String s = new String(“中文”.getBytes(“UTF-8”), “UTF-8”);
System.out.println(s);
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159818.html