一 原理:html
編碼是信息從一種形式或格式轉換爲另外一種形式的過程也稱爲計算機編程語言的代碼簡稱編碼。好比:將文本文件轉換成計算機存儲的二進制數據時的過程。java
解碼,是編碼的逆過程。好比:將二進制數據轉換成文本文件的過程。mysql
二 亂碼的產生:web
編碼產生的緣由是由於編碼的方式和解碼的方式不相同致使的;好比存儲html文件時按照gbk存儲 打開時按照utf-8打開就會出現亂碼。ajax
3、亂碼產生的狀況sql
1. 將文件導入到eclipse時:數據庫
2. 客戶端到服務器(發送請求時)編程
2.1經過get方式產生的亂碼:a: 瀏覽器
若是使用是eclipse時只需改變tomcat服務器的下和
tomcat
這樣就可解決get方式亂碼的請求了。
b:
11 byte [] bs = name.getBytes("ISO8859-1");//內部編碼字節流,按照 //默認的編碼解碼
12 String name name = new String(bs,"UTF-8"); //按照utf-8編碼
c:
當URL地址裏包含非西歐字符的字符串時,系統會將這些字符轉換成application/x-www-form-urlencoded字符串。
然而,在向服務器發送大量的文本、包含非ASCII字符的文本或二進制數據時這種編碼方式效率很低。這個時候咱們就要使用另外一種編碼類型「multipart/form-data」,好比在咱們在作上傳的時候,表單的enctype屬性通常會設置成「multipart/form-data」。
//將application/x-www-form-urlencoded字符串
//轉換成普通字符串
//必須強調的是編碼方式必須正確,如baidu的是gb2312,而google的是UTF-8
String keyWord = URLDecoder.decode("%E6%96%87%E6%A1%A3", "gb2312");
System.out.println(keyWord);
//將普通字符串轉換成
//application/x-www-form-urlencoded字符串
//必須強調的是編碼方式必須正確,如baidu的是gb2312,而google的是UTF-8
String urlStr = URLEncoder.encode("文檔", "gb2312");
System.out.println(urlStr);
d: ajax中get請求的中文亂碼
只須要在script中添加setRequestHeader("Content-Type","text/html; encoding=gb18030")
2.2經過post方式產生的亂碼
對於Post請求,只需在Servlet或者jsp中寫入以下代碼就能夠把解決從表單中傳入的中文亂碼問題 request.setCharacterEncoding("utf-8");
ajax對於使用POST,JSP的解決方法以下:
使用escape(或encodeURI,兩個函數都是JavaScript的函數,功能基本相同,能夠查一下相關的幫助),但要使用兩次,這個是關鍵。
在 web.xml 中配置 filter ,具體配置以下頁:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3服務器到客戶端的亂碼
3.1 servlet 中到客戶端
response.setContentType("text/html; charset=UTF-8");
//或者
response.setCharacterEncoding("UTF-8");
3.2 jsp到客戶端
若是.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,則eclipse會自動存爲UTF-8方式,無論eclipse的encoding是什麼;
contentType="text/html;charset=UTF-8"表示當瀏覽器獲得此文件時以什麼方式解碼:
<%@ page language="java" contentType="text/html; charset=utf-8" %>
3.3 html 通用
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
3.4 其餘
//設置編碼編碼 方式一
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("UTF-8");*/
//設置編碼方式二:(至關於request 和response設置編碼)
response.setContentType("text/html;charset=UTF-8");
4 ide項目發佈到web服務器時產生亂碼:
4.1 在TOMCAT中的server.xml中的
<Connector中添加兩個設置useBodyEncodingForURI="true" //設置POST和GET使用相同編碼
URIEncoding="UTF-8" //對URI使用utf-8編碼處理
<Connector useBodyEncodingForURI="true" URIEncoding="UTF-8" connectionTimeout="20000" maxThreads="150" port="8888" protocol="HTTP/1.1" redirectPort="8443"/>
4.2 配置如圖所示:
4.3 配置 meta
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5 服務器到數據庫產生亂碼
5.1 設置鏈接字符串的url傳入參數編碼:jdbc:mysql://localhost:3306/db_name?useUnicode=true&charaterEncoding=utf-8,
5.2 設置mysql編碼
1). 首先查看系統的字符集和排序方式: SHOW VARIABLES LIKE ''character_set_%'';
2). 1 在my.cf文件的段設置:
default-character-set=utf8
這條語句的做用是把character_set_client, character_set_connection_,character_set_results 設定爲utf8,包括對應的排列方式的 編碼。
Character_set_server是系統編碼,這個是不用改的。
固然改變character_set_client, character_set_connection_,character_set_results 編碼方式的另一種方法是:SET NAMES 「UTF8」;
它的做用至關於:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
2. 改變數據庫的編碼方式: alter database databasename character set utf8;或者
SET character_set_client = utf8;
3. 無論你是web編程仍是桌面編程,你的數據庫的鏈接地址url中,一定要後 綴:?useUnicode=true& characterEncoding=utf- 8/hibernate?useUnicode=true&characterEncoding=utf-8
3) my.ini中配置編碼
六 從數據庫到 web服務器亂碼
6.1 jsp設置pageEncoding
<%@ page language="java" pageEncoding="gb2312"%>
注:pageEncoding的內容只是用於jsp輸出時的編碼,不會做爲header發出去的。
6.2 特別的: 若是存入時按照一種編碼,取出數據仍是使用這種編碼就不會出現亂碼,即便在數據庫中是亂碼,也能讀出。
七 服務器端的亂碼
當導入sql文件時保證和數據庫的編碼格式一致,若是不一致可以使用文本工具做爲中轉站(做用:修改編碼)。
導入數據時,若是目標數據庫或表是UTF-8字符集的,而導入SQL中有中文,可能在最終結果中出現亂碼,此時只需在導入的SQL文件第一行加入以下內容 便可。
/*!40101 SET NAMES utf8 */;可是在source 命令前輸入set names utf8,而後再用source命令導入腳本,中文亂碼就解決了
八 IO流亂碼
1、
IO的亂碼每每出現字符流中,可在字節流向字符流轉換的時候處理;
new InputStreamReader(new FileInputStream(file),"UTF-8")。
2、直接使用字節流
//在建立時能夠指定字符集
public InputStreamReader(InputStream in, String charsetName){
sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
}
//若是沒有指定則獲取默認值
public static StreamDecoder forInputStreamReader(InputStream inputstream, Object obj, String s){
String s1 = s;
if(s1 == null)
s1 = Converters.getDefaultEncodingName();
if(!Converters.isCached(0, s1))
。。。
}
//默認值來自System.getProperty
public static String getDefaultEncodingName(){
GetPropertyAction getpropertyaction = new GetPropertyAction("file.encoding");//這裏取自System.getProperty(變量)
return defaultEncoding;
}
System.getProperty值的來源:首先並非操做系統os的默認編碼
問題1:file.encoding的值是什麼呢? 這個一開始我認爲是操做系統的編碼
但我錯了它的值爲保存每一個程序的main入口的那個java文件的保存編碼(點擊文件-->屬性-->text file encoding(other的值),這是使用eclipse 編譯器)。
怡清 總結於
2013 年 03月 08日