java中是如何解決編碼問題的,在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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:16
下一篇 2024-11-20 00:16

相關推薦

發表回復

登錄後才能評論