java中文亂碼解決之道(4):java編碼轉換過程

前面三篇博客側重介紹字符祝辣、編碼問題,通過這三篇博客各位博友對各種字符編碼有了一個初步的了解尿这,要了解java的中文問題這是必須要了解的。但是了解這些僅僅只是一個開始庆杜,以下博客將側重介紹java亂碼是如何產(chǎn)生的射众、存在哪些亂碼的情況、該如何從根本上解決亂碼問題晃财。各位隨博主一起征服令人厭煩的java亂碼問題吧_冻鳌!断盛!
java編碼轉換過程
我們總是用一個java類文件和用戶進行最直接的交互(輸入罗洗、輸出),這些交互內容包含的文字可能會包含中文郑临。無論這些java類是與數(shù)據(jù)庫交互栖博,還是與前端頁面交互,他們的生命周期總是這樣的:
1厢洞、程序員在操作系統(tǒng)上通過編輯器編寫程序代碼并且以.java的格式保存操作系統(tǒng)中仇让,這些文件我們稱之為源文件。
2躺翻、通過JDK中的javac.exe編譯這些源文件形成.class類丧叽。
3、直接運行這些類或者部署在WEB容器中運行公你,得到輸出結果踊淳。
這些過程是從宏觀上面來觀察的,了解這個肯定是不行的陕靠,我們需要真正來了解java是如何來編碼和被解碼的:
第一步:當我們用編輯器編寫java源文件迂尝,程序文件在保存時會采用操作系統(tǒng)默認的編碼格式(一般我們中文的操作系統(tǒng)采用的是GBK編碼格式)形成一個.java文件。java源文件是采用操作系統(tǒng)默認支持的file.encoding編碼格式保存的剪芥。下面代碼可以查看系統(tǒng)的file.encoding參數(shù)值垄开。
1

System.out.println(System.getProperty(
"file.encoding"
));

第二步:當我們使用javac.exe編譯我們的java文件時,JDK首先會確認它的編譯參數(shù)encoding來確定源代碼字符集税肪,如果我們不指定該編譯參數(shù)溉躲,JDK首先會獲取操作系統(tǒng)默認的file.encoding參數(shù),然后JDK就會把我們編寫的java源程序從file.encoding編碼格式轉化為JAVA內部默認的UNICODE格式放入內存中益兄。
第三步:JDK將上面編譯好的且保存在內存中信息寫入class文件中锻梳,形成.class文件。此時.class文件是Unicode編碼的净捅,也就是說我們常見的.class文件中的內容無論是中文字符還是英文字符疑枯,他們都已經(jīng)轉換為Unicode編碼格式了。
在這一步中對對JSP源文件的處理方式有點兒不同:WEB容器調用JSP編譯器灸叼,JSP編譯器首先會查看JSP文件是否設置了文件編碼格式神汹,如果沒有設置則JSP編譯器會調用調用JDK采用默認的編碼方式將JSP文件轉化為臨時的servlet類庆捺,然后再編譯為.class文件并保持到臨時文件夾中古今。
第四步:運行編譯的類:在這里會存在一下幾種情況
1屁魏、直接在console上運行。
2捉腥、JSP/Servlet類氓拼。
3、java類與數(shù)據(jù)庫之間抵碟。
這三種情況每種情況的方式都會不同桃漾,
1.Console上運行的類
這種情況下,JVM首先會把保存在操作系統(tǒng)中的class文件讀入到內存中拟逮,這個時候內存中class文件編碼格式為Unicode撬统,然后JVM運行它。如果需要用戶輸入信息敦迄,則會采用file.encoding編碼格式對用戶輸入的信息進行編碼同時轉換為Unicode編碼格式保存到內存中恋追。程序運行后,將產(chǎn)生的結果再轉化為file.encoding格式返回給操作系統(tǒng)并輸出到界面去罚屋。整個流程如下:


在上面整個流程中苦囱,凡是涉及的編碼轉換都不能出現(xiàn)錯誤,否則將會產(chǎn)生亂碼脾猛。
2.Servlet類
由于JSP文件最終也會轉換為servlet文件(只不過存儲的位置不同而已)撕彤,所以這里我們也將JSP文件納入其中。
當用戶請求Servlet時猛拴,WEB容器會調用它的JVM來運行Servlet羹铅。首先JVM會把servlet的class加載到內存中去,內存中的servlet代碼是Unicode編碼格式的愉昆。然后JVM在內存中運行該Servlet职员,在運行過程中如果需要接受從客戶端傳遞過來的數(shù)據(jù)(如表單和URL傳遞的數(shù)據(jù)),則WEB容器會接受傳入的數(shù)據(jù)撼唾,在接收過程中如果程序設定了傳入?yún)?shù)的的編碼則采用設定的編碼格式廉邑,如果沒有設置則采用默認的ISO-8859-1編碼格式,接收的數(shù)據(jù)后JVM會將這些數(shù)據(jù)進行編碼格式轉換為Unicode并且存入到內存中倒谷。運行Servlet后產(chǎn)生輸出結果蛛蒙,同時這些輸出結果的編碼格式仍然為Unicode。緊接著WEB容器會將產(chǎn)生的Unicode編碼格式的字符串直接發(fā)送置客戶端渤愁,如果程序指定了輸出時的編碼格式牵祟,則按照指定的編碼格式輸出到瀏覽器,否則采用默認的ISO-8859-1編碼格式抖格。整個過程流程圖如下:
2014122700001

3.數(shù)據(jù)庫部分
我們知道java程序與數(shù)據(jù)庫的連接都是通過JDBC驅動程序來連接的诺苹,而JDBC驅動程序默認的是ISO-8859-1編碼格式的咕晋,也就是說我們通過java程序向數(shù)據(jù)庫傳遞數(shù)據(jù)時,JDBC首先會將Unicode編碼格式的數(shù)據(jù)轉換為ISO-8859-1的編碼格式收奔,然后在存儲在數(shù)據(jù)庫中掌呜,即在數(shù)據(jù)庫保存數(shù)據(jù)時,默認格式為ISO-8859-1坪哄。
201412270001

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末质蕉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翩肌,更是在濱河造成了極大的恐慌模暗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件念祭,死亡現(xiàn)場離奇詭異兑宇,居然都是意外死亡,警方通過查閱死者的電腦和手機粱坤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門隶糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人比规,你說我怎么就攤上這事若厚。” “怎么了蜒什?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵测秸,是天一觀的道長。 經(jīng)常有香客問我灾常,道長霎冯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任钞瀑,我火速辦了婚禮沈撞,結果婚禮上,老公的妹妹穿的比我還像新娘雕什。我一直安慰自己缠俺,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布贷岸。 她就那樣靜靜地躺著壹士,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偿警。 梳的紋絲不亂的頭發(fā)上躏救,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音,去河邊找鬼盒使。 笑死崩掘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的少办。 我是一名探鬼主播苞慢,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凡泣!你這毒婦竟也來了枉疼?” 一聲冷哼從身側響起皮假,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤鞋拟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惹资,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贺纲,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年褪测,在試婚紗的時候發(fā)現(xiàn)自己被綠了猴誊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侮措,死狀恐怖懈叹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情分扎,我是刑警寧澤澄成,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站畏吓,受9級特大地震影響墨状,放射性物質發(fā)生泄漏。R本人自食惡果不足惜菲饼,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一肾砂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宏悦,春花似錦镐确、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至派哲,卻和暖如春臼氨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芭届。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工储矩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留感耙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓持隧,卻偏偏與公主長得像即硼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屡拨,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容