Java 中文亂碼

運(yùn)行環(huán)境:Windows 10 茎用;IDEA-2019.3遣总;Tomcat 9.0.24;jdk 1.8.0_221轨功;

問(wèn)題切入

我在idea中開(kāi)發(fā)ssm框架的項(xiàng)目旭斥,然后直接在集成的tomat中運(yùn)行,其他日志都是正常顯示古涧,唯獨(dú)mybatis的參數(shù)日志中文亂碼垂券。

上面就是我遇到的具體亂碼問(wèn)題場(chǎng)景。從這個(gè)問(wèn)題的出現(xiàn)羡滑,以及我解決的過(guò)程菇爪。讓我有了寫這篇文章的動(dòng)機(jī)算芯。
中文亂碼,是我們這些中文世界的程序員常見(jiàn)到想吐的問(wèn)題凳宙。發(fā)生的頻率如此頻繁熙揍。解決的方式也是如此碰運(yùn)氣。讓我也是很氣餒氏涩。每一次遇到中文亂碼诈嘿,就像遇到一個(gè)新問(wèn)題,你不知道是哪個(gè)環(huán)節(jié)出了問(wèn)題削葱,你也不知道需要怎樣的配置解決奖亚。全靠百度搜索,碰運(yùn)氣解決析砸。
我思考了一通昔字,嘗試做個(gè)記錄,盡量去發(fā)現(xiàn)解決的通用邏輯首繁。
解決亂碼問(wèn)題作郭,我想要通過(guò)這么幾步,首先弦疮,要明白編碼/解碼原理夹攒;其次,要知道所有環(huán)節(jié)的默認(rèn)編碼胁塞;最后咏尝,要知道解決問(wèn)題的配置方式的含義。
我也要按這個(gè)思路來(lái)梳理啸罢。

亂碼底層原理分析

image.png

畫了個(gè)簡(jiǎn)單的圖编检,如上面,正常情況下扰才,解碼和編碼的過(guò)程中都要使用一致的編碼格式允懂。
如果發(fā)生亂碼,考慮存在以下問(wèn)題:

  • 編碼和解碼的格式不一致衩匣。
  • 編碼時(shí)使用的編碼格式不支持字符蕾总,當(dāng)時(shí)就亂碼了。解碼時(shí)琅捏,使用一致的編碼格式生百,也會(huì)亂碼。

如果發(fā)生亂碼午绳,就要從上面的兩種情況去考慮解決了置侍。

所有環(huán)節(jié)的默認(rèn)編碼

這里,也是亂碼問(wèn)題最難解決的問(wèn)題關(guān)鍵所在。因?yàn)槔唬S著軟件工業(yè)的發(fā)展杠输,封裝越來(lái)越厲害。終端使用者秕衙,根本不能知道終端使用之前蠢甲,經(jīng)歷了多少個(gè)環(huán)節(jié)的編碼和解碼過(guò)程。所以据忘,你去解決亂碼問(wèn)題鹦牛,也只能是丈二和尚摸不著頭腦了。
我這里也只能慢慢的窮舉我知道的環(huán)節(jié)的默認(rèn)編碼勇吊。

  • windows系統(tǒng)默認(rèn)編碼 : GBK
    這也是很多亂碼的源泉曼追。程序員都在說(shuō)要推進(jìn)統(tǒng)一編碼格式UTF-8『汗妫可是系統(tǒng)級(jí)別也沒(méi)有使用UTF-8呀礼殊。
  • Java文件編譯后形成class默認(rèn)編碼:UTF-16編碼
  • JVM中的默認(rèn)編碼:受平臺(tái),配置影響针史。
  • idea開(kāi)發(fā)工具默認(rèn)編碼:idea本質(zhì)也是一個(gè)java應(yīng)用晶伦,還是遵循JVM的編碼設(shè)置規(guī)則。
  • tomcat服務(wù)器默認(rèn)編碼:tomcat本質(zhì)也是一個(gè)java的應(yīng)用啄枕,還是遵循JVM的編碼設(shè)置規(guī)則婚陪。
  • 源碼文件默認(rèn)編碼:根據(jù)自己設(shè)定。

配置參數(shù)含義

  • -Dfile.encoding=UTF-8

-Dfile.encoding 解釋:
在命令行中輸入 java频祝,在給出的提示中會(huì)出現(xiàn) -D 的說(shuō)明:
-D<name>=<value> # set a system property
-D 后面需要跟一個(gè)鍵值對(duì)泌参,作用是設(shè)置一項(xiàng)系統(tǒng)屬性
對(duì) -Dfile.encoding=UTF-8 來(lái)說(shuō)就是設(shè)置系統(tǒng)屬性 file.encoding 為 UTF-8
那么 file.encoding 什么意思?字面意思為文件編碼智润。
搜索 java 源碼及舍,只能找到 4 個(gè)文件中包含 file.encoding 的文件未辆,
也就是說(shuō)窟绷,只有四個(gè)文件調(diào)用了 file.encoding 這個(gè)屬性。
在 java.nio.charset 包中的 Charset.java 中咐柜,這段話的意思說(shuō)的很明確了兼蜈。
簡(jiǎn)單說(shuō)就是默認(rèn)字符集是在 java 虛擬機(jī)啟動(dòng)時(shí)決定的,
依賴于 java 虛擬機(jī)所在的操作系統(tǒng)的區(qū)域以及字符集拙友。
代碼中可以看到为狸,默認(rèn)字符集就是從 file.encoding 這個(gè)屬性中獲取的。

  • idea集成tomcat后遗契,tomcat的編碼設(shè)置


    image.png
  • idea工具的編碼設(shè)置


    image.png

總結(jié)

我力圖去理解亂碼的問(wèn)題解決辐棒,我后續(xù)還會(huì)繼續(xù)充實(shí)此文。或者漾根,隨著我對(duì)編碼的理解加深泰涂,也會(huì)推翻現(xiàn)在的邏輯。

附錄:
有些段落引用自:http://yang3wei.github.io/blog/2013/02/10/java-dfile-dot-encoding-equals-utf-8-gan-diao-luan-ma/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辐怕,一起剝皮案震驚了整個(gè)濱河市逼蒙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寄疏,老刑警劉巖是牢,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陕截,居然都是意外死亡驳棱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門农曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹈胡,“玉大人,你說(shuō)我怎么就攤上這事朋蔫》=ィ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵驯妄,是天一觀的道長(zhǎng)荷并。 經(jīng)常有香客問(wèn)我,道長(zhǎng)青扔,這世上最難降的妖魔是什么源织? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮微猖,結(jié)果婚禮上谈息,老公的妹妹穿的比我還像新娘。我一直安慰自己凛剥,他們只是感情好侠仇,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著犁珠,像睡著了一般逻炊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犁享,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天余素,我揣著相機(jī)與錄音,去河邊找鬼炊昆。 笑死桨吊,一個(gè)胖子當(dāng)著我的面吹牛威根,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播视乐,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼医窿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炊林?” 一聲冷哼從身側(cè)響起姥卢,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渣聚,沒(méi)想到半個(gè)月后独榴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奕枝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年棺榔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘道。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡症歇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谭梗,到底是詐尸還是另有隱情忘晤,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布激捏,位于F島的核電站设塔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏远舅。R本人自食惡果不足惜闰蛔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望图柏。 院中可真熱鬧序六,春花似錦、人聲如沸蚤吹。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)距辆。三九已至余佃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跨算,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工椭懊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诸蚕,地道東北人步势。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像背犯,于是被迫代替她去往敵國(guó)和親坏瘩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容