Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
明:本欄目所使用的素材都是凱哥學(xué)堂VIP學(xué)員所寫,學(xué)員有權(quán)匿名,對(duì)文章有最終解釋權(quán);凱哥學(xué)堂旨在促進(jìn)VIP學(xué)員互相學(xué)習(xí)的基礎(chǔ)上公開筆記。
關(guān)于亂碼問題的解決
會(huì)有亂碼現(xiàn)象,其實(shí)就是因?yàn)樽址幋a不一致的問題,就好像中國人和外國人談話一樣,互相不懂對(duì)方在說啥。字符集編碼也是如此,本來就是一段GBK編碼的文字,卻要用utf-8的編碼格式去解碼,就當(dāng)然是雞同鴨講會(huì)出現(xiàn)亂碼啦,這個(gè)時(shí)候就得使用GBK編碼的格式去解碼才不會(huì)出問題。如果互相都是使用的GBK編碼后,那就像中國人和中國人都說普通話一樣,就能聽懂對(duì)方在說什么,這樣才不會(huì)出現(xiàn)亂碼。
在web開發(fā)中,請(qǐng)求或響應(yīng)數(shù)據(jù)時(shí)出現(xiàn)亂碼,往往就是客戶端和服務(wù)端的編碼不一致的問題所導(dǎo)致的。
不過在介紹如何解決亂碼的問題前,我們先看看HttpServletRequest中關(guān)于獲得表單數(shù)據(jù)的一些方法,雖然在上一篇也介紹了使用方式,不過關(guān)于亂碼和拿到具體的值這方面沒有涉及到:
獲得和設(shè)置表單數(shù)據(jù)方法(如果是上傳文件的話則無法獲取文件中的數(shù)據(jù)):
既然和表單有關(guān),那么就得先寫一個(gè)簡(jiǎn)單的html表單代碼,我們可以在Eclipse中創(chuàng)建一個(gè)html文件:
可能使用Eclipse編寫HTML的代碼不太方便,我們也可以使用一個(gè)專門編寫html代碼的工具來編寫Eclipse里已經(jīng)創(chuàng)建了的html文件,我這里使用HBuilder作為示例:
1.復(fù)制Eclipse中的html文件所在目錄的路徑:
2.在HBuilder中點(diǎn)擊文件,然后選擇打開目錄把復(fù)制的文件路徑粘貼進(jìn)去,并為這個(gè)工程起一個(gè)新的名稱:
工程目錄如下:
如圖,可以看到index.html已經(jīng)在這個(gè)工程下了,我們可以在HBuilder中編輯這個(gè)html文件,編輯的內(nèi)容會(huì)同步到Eclipse,因?yàn)樗鼈z訪問的都是同一個(gè)目錄同一個(gè)html文件。
3.我在HBuilder編輯的代碼如下:
4.再看看Eclipse發(fā)生了什么:
可以看到代碼是同步的。
瀏覽器運(yùn)行結(jié)果:
以下使用實(shí)際代碼演示常用的幾個(gè)獲得表單數(shù)據(jù)的方法,代碼示例:
在Eclipse中執(zhí)行html文件,Eclipse有一個(gè)內(nèi)置的瀏覽器:
如果要在其他的瀏覽器則需要使用這個(gè)URL地址:
http://localhost:8080/TestResponse/index.html
不要直接在HBuilder中運(yùn)行這個(gè)html文件,因?yàn)樗腢RL是指向HBuilder的工程路徑的。
控制臺(tái)打印結(jié)果:
如圖,可以看到我們將所有的值都獲得到手了。
獲得表單數(shù)據(jù)的時(shí)候要注意一個(gè)問題:當(dāng)你需要獲得一個(gè)屬性的值時(shí),如果得到的結(jié)果為null,那么就是因?yàn)楸韱螖?shù)據(jù)中并沒有這個(gè)屬性的存在。例如我獲得一個(gè)不存在的屬性:
控制臺(tái)打印結(jié)果:
可以看到結(jié)果為null,所以當(dāng)你獲得表單數(shù)據(jù)進(jìn)行某些操作時(shí),出現(xiàn)了空指針異常的話,很有可能就是因?yàn)榇a上寫錯(cuò)了獲得了一個(gè)不存在的屬性。
如果表單數(shù)據(jù)中的某個(gè)屬性值沒有寫,那么獲得的將是一個(gè)空字符串,而非null,例如:
控制臺(tái)打印結(jié)果:
如圖,并沒有打印null,而是打印空白,這個(gè)空白就是一個(gè)空字符串:’’
會(huì)出現(xiàn)亂碼的情況,以及解決方法:
現(xiàn)在我們修改一下代碼把表單提交的方法改為post,再運(yùn)行一次,看看控制臺(tái)的打印結(jié)果,html代碼示例:
Java代碼示例:
提交的表單:
控制臺(tái)的打印結(jié)果:
可以看到控制臺(tái)中的打印結(jié)果出現(xiàn)了不能識(shí)別的字符,解決方法很簡(jiǎn)單,使用setCharacterEncoding(String)方法,設(shè)置表單提交的數(shù)據(jù)的編碼格式即可:
運(yùn)行結(jié)果:
注意:除了在Java代碼中需要設(shè)置編碼格式,在html文件中也要設(shè)置好編碼格式,如果html中不設(shè)置編碼格式的話,即便在Java代碼中使用了setCharacterEncoding(String)方法設(shè)置了也沒有用,所以這是雙向的,例如我把html文件中設(shè)置編碼格式的標(biāo)簽給刪掉:
可以看到在網(wǎng)頁上顯示都是亂碼(這是因?yàn)镋clipse內(nèi)置的瀏覽器原因,一般市面上的瀏覽器提前預(yù)設(shè)了字符編碼,所以不會(huì)出現(xiàn)這種情況)
控制臺(tái)打印結(jié)果:
果然出現(xiàn)了不能識(shí)別的字符,所以html文件也是需要設(shè)置好編碼的,不然的話就會(huì)出現(xiàn)亂碼的情況。
下面來看看瀏覽器的地址欄中為什么能夠顯示中文:
這其實(shí)是因?yàn)闉g覽器轉(zhuǎn)碼了,可以把這個(gè)URL復(fù)制到記事本中:
可以看到是一堆的編碼,并沒有顯示中文,所以實(shí)際上瀏覽器就是把這個(gè)編碼給轉(zhuǎn)換成了中文而已。
只要不屬于128個(gè)字符內(nèi)的字符,在地址欄中都會(huì)轉(zhuǎn)換成這種格式的編碼,這些編碼格式是采用的16進(jìn)制的編碼格式,以上面這文本示例編碼對(duì)應(yīng)的中文:
如圖,每一個(gè)16進(jìn)制編碼都是以%開頭,這是utf-8編碼的中文,所以一個(gè)中文字對(duì)應(yīng)3個(gè)16進(jìn)制編碼。
如果是GBK編碼格式的中文則是一個(gè)中文字對(duì)應(yīng)2個(gè)16進(jìn)制編碼,但是GBK編碼格式轉(zhuǎn)換成的16進(jìn)制編碼不能被瀏覽器轉(zhuǎn)換,會(huì)仍然顯示著16進(jìn)制編碼:
中文字對(duì)應(yīng)的16進(jìn)制編碼:
如圖,GBK編碼格式的中文字和utf-8編碼的中文字不一樣,是2個(gè)16進(jìn)制編碼對(duì)應(yīng)一個(gè)中文字。
關(guān)于客戶端請(qǐng)求數(shù)據(jù)方面的亂碼情況就介紹這么多,另外響應(yīng)數(shù)據(jù)中出現(xiàn)亂碼的情況和解決方法在介紹HttpServletResponse方法部分進(jìn)行說明。
思維導(dǎo)圖:
HttpServletResponse中的方法
HttpServletResponse接口類型的對(duì)象是封裝服務(wù)端響應(yīng)數(shù)據(jù)的,所以這個(gè)對(duì)象中的方法都是與響應(yīng)數(shù)據(jù)相關(guān)。以下羅列一些常用的方法:
下面使用實(shí)際的例子,演示以上方法的使用方式:
編輯響應(yīng)頭一類的方法:
代碼示例:
在服務(wù)端設(shè)置響應(yīng)數(shù)據(jù)的編碼格式是很有必要的,這么做同樣的也是為了避免出現(xiàn)亂碼的問題。例如以下這個(gè)示例,我不設(shè)置響應(yīng)數(shù)據(jù)的編碼格式,并輸出一段中文,看看會(huì)發(fā)生什么,代碼示例:
運(yùn)行結(jié)果:
如圖,可以看到,沒有設(shè)置響應(yīng)數(shù)據(jù)的編碼格式的話,輸出中文就會(huì)無法被識(shí)別。
這種問題設(shè)置一下響應(yīng)數(shù)據(jù)的編碼格式就好了,但是服務(wù)端設(shè)置的編碼格式,要與瀏覽器端的編碼格式對(duì)應(yīng)上,如果不對(duì)應(yīng)的話仍然會(huì)是亂碼,代碼示例:
運(yùn)行結(jié)果:
添加新的響應(yīng)頭數(shù)據(jù):
代碼示例:
打開TCP/IP Monitor窗口,可以看到以上代碼添加進(jìn)響應(yīng)頭的數(shù)據(jù):
獲得設(shè)置的響應(yīng)頭信息:
代碼示例:
控制臺(tái)打印結(jié)果:
修改響應(yīng)頭信息:
代碼示例:
TCP/IP Monitor窗口:
總結(jié):
解決客戶端表單提交數(shù)據(jù)亂碼的問題,需要使用setCharacterEncoding(String)方法,設(shè)置好與客戶端對(duì)應(yīng)的編碼格式。
解決服務(wù)端響應(yīng)數(shù)據(jù)亂碼的問題,則使用setCharacterEncoding(String)方法,設(shè)置好對(duì)應(yīng)的編碼格式。
HttpServletRequest是封裝請(qǐng)求數(shù)據(jù)的對(duì)象,所以它的方法都是與客戶端請(qǐng)求信息相關(guān)的。
HttpServletResponse是封裝響應(yīng)數(shù)據(jù)的對(duì)象,所以它的方法都是與服務(wù)端響應(yīng)信息相關(guān)的。
abbix6安裝完成后,其web界面默認(rèn)是英文界面,點(diǎn)擊“User Settings”->“Profile”->“User”,將Language選擇為中文,點(diǎn)擊“Update”修改為中文,如下圖:
先修改web界面為中文
點(diǎn)擊“監(jiān)測(cè)”->“最新數(shù)據(jù)”,在“主機(jī)”和“名稱”里面輸入想要的數(shù)據(jù),點(diǎn)擊“應(yīng)用”即可顯示相應(yīng)指標(biāo)的最新數(shù)據(jù),如下圖:
顯示最新數(shù)據(jù)
在最新數(shù)據(jù)頁面,點(diǎn)擊“圖形”查看曲線圖,最下面顯示亂碼,如下圖:
顯示中文亂碼
原因:
由于zabbix6默認(rèn)沒有中文字體,因此會(huì)顯示亂碼。
解決過程:
1.在web主機(jī)上查找字體相關(guān)的php文件,如下圖:
查看字體相關(guān)的php文件路徑
# more /zabbix/nginx-1.20.1/html/zabbix/include/defines.inc.php
查看字體名稱和文件路徑
在一臺(tái)windows主機(jī)下找到simhei.ttf字體,方法為:控制面板-字體-復(fù)制(楷體-常規(guī))
# cd /zabbix/nginx-1.20.1/html/zabbix/assets/fonts
# cp DejaVuSans.ttf DejaVuSans.ttf.bak
# mv simhei.ttf DejaVuSans.ttf
中文顯示正常
vue項(xiàng)目使用npm run build命令打包時(shí),編譯不成功,提示css文件“ModuleParseError: Module parse failed: Unexpected character ' '”,這是因?yàn)閣ebpack配置文件缺少對(duì)字體等文件的處理。
對(duì)webpack配置文件增加匹配規(guī)則:
{
test: /\.(png|jpg|gif|svg|cur)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
}
webpack.base.conf.js
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。