JAVA與編碼
JAVA很容易出現亂碼...具體分析以下幾個環節的編碼。
1.編譯
JAVA原始檔可能是GBK編碼也可能是UTF8編碼,使用javac命令編譯的時候,會使用作業系統預設的編碼編譯檔案。
如果平臺是windows,而原始檔是UTF8編碼,則遇到了第一個亂碼問題。
這時候可以使用javac命令的encoding選項,標明原始檔的編碼格式。
經過編譯之後,JAVA位元組碼檔案以UTF8編碼儲存在class檔案中。
-encoding 指定原始檔使用的字元編碼
2.執行
JAVA在執行時,採用unicode編碼,JAVA系統內部不存在亂碼問題。
但是輸入輸出還是依賴外部編碼。預設使用作業系統的預設編碼。
也可以指定file.encoding引數。
如果設定了file.encoding引數,System.in、System.out、string.getBytes()等都會使用這個設定的編碼解析資料,否則使用平臺的預設編碼。
平臺是windows系統,預設編碼為GBK,可以看到不同的file.encoding引數導致執行結果的不一樣。
3.JDBC編碼
因為JAVA系統執行時採用unicode編碼,如果資料庫採用GBK或者utf8編碼,則可能出現亂碼問題。
Oracle資料庫採用唯一編碼,oracle的jdbc會自動將unicode轉換為目標Oracle資料庫的編碼。
而Mysql可以同時使用多種編碼,所以需要在Mysql JDBC的url中指定目標資料庫的編碼。
4.URL編碼
如果需要在URL中傳輸中文引數,除了JS兩次編碼的方式,也可以使用如下方式。
執行結果如下:
??????è?·?±?
中文請求
兩次JS編碼方式參見:http://blog.itpub.net/29254281/viewspace-775925/
詳細資料:http://blog.csdn.net/feihong247/article/details/7841237
5.關於指定編碼
無論是Spring的CharacterEncodingFilter還是request的setCharacterEncoding,都是為byte[]指定解碼的規則,而不是轉換。
1.編譯
JAVA原始檔可能是GBK編碼也可能是UTF8編碼,使用javac命令編譯的時候,會使用作業系統預設的編碼編譯檔案。
如果平臺是windows,而原始檔是UTF8編碼,則遇到了第一個亂碼問題。
這時候可以使用javac命令的encoding選項,標明原始檔的編碼格式。
經過編譯之後,JAVA位元組碼檔案以UTF8編碼儲存在class檔案中。
-encoding 指定原始檔使用的字元編碼
2.執行
JAVA在執行時,採用unicode編碼,JAVA系統內部不存在亂碼問題。
但是輸入輸出還是依賴外部編碼。預設使用作業系統的預設編碼。
也可以指定file.encoding引數。
如果設定了file.encoding引數,System.in、System.out、string.getBytes()等都會使用這個設定的編碼解析資料,否則使用平臺的預設編碼。
-
public class Test {
-
public static void main(String[] args) {
-
String data="中文";
-
System.out.println(Charset.defaultCharset());
-
System.out.println(data);
-
}
- }
3.JDBC編碼
因為JAVA系統執行時採用unicode編碼,如果資料庫採用GBK或者utf8編碼,則可能出現亂碼問題。
Oracle資料庫採用唯一編碼,oracle的jdbc會自動將unicode轉換為目標Oracle資料庫的編碼。
而Mysql可以同時使用多種編碼,所以需要在Mysql JDBC的url中指定目標資料庫的編碼。
4.URL編碼
如果需要在URL中傳輸中文引數,除了JS兩次編碼的方式,也可以使用如下方式。
-
public class Test {
-
public static void main(String[] args) throws UnsupportedEncodingException {
-
// 模擬瀏覽器將中文引數編碼
-
String data = "%E4%B8%AD%E6%96%87%E8%AF%B7%E6%B1%82";
-
-
// 模擬Tomcat使用預設URIEncoding解碼[ISO-8859-1]
-
data = URLDecoder.decode(data, "ISO-8859-1");
-
System.out.println(data);
-
-
//模擬在doGet中獲取引數
-
data=new String(data.getBytes("ISO-8859-1"),"utf8");
-
System.out.println(data);
-
}
- }
??????è?·?±?
中文請求
兩次JS編碼方式參見:http://blog.itpub.net/29254281/viewspace-775925/
詳細資料:http://blog.csdn.net/feihong247/article/details/7841237
5.關於指定編碼
無論是Spring的CharacterEncodingFilter還是request的setCharacterEncoding,都是為byte[]指定解碼的規則,而不是轉換。
-
public class Test {
-
public static void main(String[] args) throws UnsupportedEncodingException {
-
byte[] data = "中".getBytes("utf8");
-
System.out.println(new String(data, "utf8"));
-
System.out.println(new String(data, "gbk"));
-
//執行結果:
-
//中
-
//涓?
-
}
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1063133/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java Java與編碼Java
- java編碼Java
- Java程式碼的編譯與反編譯那些事兒Java編譯
- Java編譯與反編譯Java編譯
- 【字元編碼】Java編碼格式探祕字元Java
- Java的識別符號與編碼規範Java符號
- java安全編碼指南之:字串和編碼Java字串
- Java編碼測試Java
- Java實現BCD編碼與十進位制轉換Java
- python與編碼Python
- 編碼與調製
- java編譯、編碼、語言設定Java編譯
- URL編碼與解碼原理
- OpenLR 的編碼與解碼
- [java IO流]之編碼和解碼Java
- Java字串編碼介紹Java字串編碼
- 體面編碼之JavaJava
- 阿里Java編碼規範阿里Java
- java字元編碼轉換Java字元
- java 編碼的習慣Java
- Java 編碼規範 (轉)Java
- java編碼規範 (轉)Java
- [java]java實現哈夫曼編碼Java
- 編碼規範 - 養成良好的Java編碼習慣Java
- java安全編碼指南之:方法編寫指南Java
- Go JSON編碼與解碼?GoJSON
- Java語言編碼規範Java
- java中的編碼簡介Java
- java 猜測 檔案編碼Java
- [Java]使用lombok提高編碼效率JavaLombok
- Google的Java編碼規範GoJava
- java編碼之間轉換Java
- Java IO4:字元編碼Java字元
- java編碼規範(2) (轉)Java
- JAVA的中文編碼問題Java
- Tomcat 改伺服器編碼(Java 修改字串編碼格式)Tomcat伺服器Java字串編碼
- PHP編碼gzdeflate與Golang解碼DEFLATEPHPGolang
- Android 中的編碼與解碼Android