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
天突然想到之前的一個項目,是和另一個公司合作,我提供后臺,對方寫小程序調(diào)用我的接口,我本地測試好接口后,是沒有問題的,然后部署到對方服務(wù)器(windows系統(tǒng)),接著就是出先各種各樣的亂碼問題,在這里匯總記錄下,以便后面學(xué)習(xí)。
java亂碼出現(xiàn)的問題有很多,這里主要記錄下tomcat,log4j,mysql,jsp,html,http(get,post請求亂碼處理)。常見的問題可能是tomcat,http請求亂碼問題了,至于jsp和html的亂碼問題就很簡單了,相信大家也知道,我也就不多說了,首先來說下tomcat的亂碼問題,
一個是程序需要發(fā)送http GET請求到服務(wù)器,請求的參數(shù)中包含了中文字符。程序中參數(shù)為UTF-8格式,且經(jīng)過了UTF-8 URL編碼再發(fā)送。使用的tomcat服務(wù)器,但服務(wù)器端后臺程序中取到的參數(shù)的中文是亂碼。
解決辦法:修改Tomcat的Server.xml,在Connector標(biāo)簽中加上URLEncoding參數(shù)。
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="99" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>
另一個是tomcat控制臺打印亂碼,程序中輸出到tomcat控制臺的中文信息亂碼了,
解決辦法:打開文件/tomcat/bin/catalina.bat,然后設(shè)置set JAVA_OPTS= 的內(nèi)容中添加選項-Dfile.encoding=UTF-8即可,當(dāng)然,我不敢包證,但是我的就是這么處理然后就可以了。
然后是log4j的日志打印亂碼,這個亂碼也是打印在tomcat控制臺的時候亂碼,但是日志文件卻不會,而且我本地測試的時候打印也不會亂碼
而且我配置的也是utf-8,這個曾經(jīng)讓我惱火好久,后面我偶然在一篇博客上發(fā)現(xiàn),說有些服務(wù)器你配utf-8是不行的,他的是編碼就是GBK,我就權(quán)當(dāng)試試,沒想到還真是這個問題,這也是讓我很無語,,,,
然后就是http請求的亂碼,我這個亂碼問題是我在shiro判斷是否登錄的時候,因為我是前后端分離,所以我shiro判斷未登錄的時候,是返回狀態(tài)碼和提示信息,而不是跳轉(zhuǎn)登錄頁面,我用response返回中文提示信息是,結(jié)果返回的是亂碼,可是我明明設(shè)置了
res.setCharacterEncoding("utf-8");
可是到前端頁面的時候還是亂碼了,這讓我很費解,后面我仔細(xì)想了下,我服務(wù)端是設(shè)置了返回utf-8的編碼,但是瀏覽器是用utf-8去解析的嗎?后面去查了下還要加一條配置,
res.setContentType("text/html;charset=utf-8");
之前知道有這個配置,但是一直不知道有什么區(qū)別,今天算是明白了一點,這個就是告訴瀏覽器,你要用什么編碼去解析這個數(shù)據(jù)。
最后一個是mysql 中文的亂碼了,這個著實讓我煩惱了好久,我去網(wǎng)上查了,說建表的時候要設(shè)置utf-8的編碼,可是我在新建數(shù)據(jù)庫的時候就設(shè)置了默認(rèn)就是utf-8的編碼,然后我說要配置數(shù)據(jù)庫的默認(rèn)編碼,修改mysql配置文件/etc/my.cnf。
[mysqld] character-set-server=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8
我設(shè)置好這個以后,終于不會亂了,但是,,保存進去的中文居然全部變成了???號,于是又去奔波了,
通過這個命令,我們可以看到,我們服務(wù)端居然還不是utf-8???
這讓我很傷,終于,尋的良方,
只要在數(shù)據(jù)庫properties文件的連接信息里加兩個參數(shù)
?useUnicode=true&characterEncoding=utf-8
就可以了,唉,真是一波三折啊,
真是與服務(wù)器斗,其樂無窮;與數(shù)據(jù)庫斗,其樂無窮;與瀏覽器斗,其樂無窮啊
融界2024年1月16日消息,據(jù)國家知識產(chǎn)權(quán)局公告,中信銀行股份有限公司申請一項名為“一種基于iText的支持生僻字轉(zhuǎn)換方法及系統(tǒng)”的專利,公開號CN117408230A,申請日期為2023年10月。
專利摘要顯示,本發(fā)明提供了一種基于iText的支持生僻字轉(zhuǎn)換方法及系統(tǒng),涉及人工智能技術(shù)領(lǐng)域。其中,所述方法包括:獲得生僻字字庫;獲得常規(guī)字字庫;將所述生僻字字庫與所述常規(guī)字字庫進行組合,獲得字庫集合;根據(jù)所述字庫集合對HTML進行字體樣式設(shè)定,獲得HTML信息;將所述字庫集合設(shè)置到iText中,調(diào)用所述iText對所述HTML信息進行PDF轉(zhuǎn)換,獲得轉(zhuǎn)換文件。解決了現(xiàn)有技術(shù)中存在遇到生成含有生僻字的HTML轉(zhuǎn)換PDF場景時,無法正常完成生僻字轉(zhuǎn)換,出現(xiàn)生僻字變?yōu)閬y碼,且使用升級現(xiàn)有中文字字庫的方法不能隨時新增生僻字,靈活性差的技術(shù)問題。
本文源自金融界
明:本欄目所使用的素材都是凱哥學(xué)堂VIP學(xué)員所寫,學(xué)員有權(quán)匿名,對文章有最終解釋權(quán);凱哥學(xué)堂旨在促進VIP學(xué)員互相學(xué)習(xí)的基礎(chǔ)上公開筆記。
關(guān)于亂碼問題的解決
會有亂碼現(xiàn)象,其實就是因為字符集編碼不一致的問題,就好像中國人和外國人談話一樣,互相不懂對方在說啥。字符集編碼也是如此,本來就是一段GBK編碼的文字,卻要用utf-8的編碼格式去解碼,就當(dāng)然是雞同鴨講會出現(xiàn)亂碼啦,這個時候就得使用GBK編碼的格式去解碼才不會出問題。如果互相都是使用的GBK編碼后,那就像中國人和中國人都說普通話一樣,就能聽懂對方在說什么,這樣才不會出現(xiàn)亂碼。
在web開發(fā)中,請求或響應(yīng)數(shù)據(jù)時出現(xiàn)亂碼,往往就是客戶端和服務(wù)端的編碼不一致的問題所導(dǎo)致的。
不過在介紹如何解決亂碼的問題前,我們先看看HttpServletRequest中關(guān)于獲得表單數(shù)據(jù)的一些方法,雖然在上一篇也介紹了使用方式,不過關(guān)于亂碼和拿到具體的值這方面沒有涉及到:
獲得和設(shè)置表單數(shù)據(jù)方法(如果是上傳文件的話則無法獲取文件中的數(shù)據(jù)):
既然和表單有關(guān),那么就得先寫一個簡單的html表單代碼,我們可以在Eclipse中創(chuàng)建一個html文件:
可能使用Eclipse編寫HTML的代碼不太方便,我們也可以使用一個專門編寫html代碼的工具來編寫Eclipse里已經(jīng)創(chuàng)建了的html文件,我這里使用HBuilder作為示例:
1.復(fù)制Eclipse中的html文件所在目錄的路徑:
2.在HBuilder中點擊文件,然后選擇打開目錄把復(fù)制的文件路徑粘貼進去,并為這個工程起一個新的名稱:
工程目錄如下:
如圖,可以看到index.html已經(jīng)在這個工程下了,我們可以在HBuilder中編輯這個html文件,編輯的內(nèi)容會同步到Eclipse,因為它倆訪問的都是同一個目錄同一個html文件。
3.我在HBuilder編輯的代碼如下:
4.再看看Eclipse發(fā)生了什么:
可以看到代碼是同步的。
瀏覽器運行結(jié)果:
以下使用實際代碼演示常用的幾個獲得表單數(shù)據(jù)的方法,代碼示例:
在Eclipse中執(zhí)行html文件,Eclipse有一個內(nèi)置的瀏覽器:
如果要在其他的瀏覽器則需要使用這個URL地址:
http://localhost:8080/TestResponse/index.html
不要直接在HBuilder中運行這個html文件,因為它的URL是指向HBuilder的工程路徑的。
控制臺打印結(jié)果:
如圖,可以看到我們將所有的值都獲得到手了。
獲得表單數(shù)據(jù)的時候要注意一個問題:當(dāng)你需要獲得一個屬性的值時,如果得到的結(jié)果為null,那么就是因為表單數(shù)據(jù)中并沒有這個屬性的存在。例如我獲得一個不存在的屬性:
控制臺打印結(jié)果:
可以看到結(jié)果為null,所以當(dāng)你獲得表單數(shù)據(jù)進行某些操作時,出現(xiàn)了空指針異常的話,很有可能就是因為代碼上寫錯了獲得了一個不存在的屬性。
如果表單數(shù)據(jù)中的某個屬性值沒有寫,那么獲得的將是一個空字符串,而非null,例如:
控制臺打印結(jié)果:
如圖,并沒有打印null,而是打印空白,這個空白就是一個空字符串:’’
會出現(xiàn)亂碼的情況,以及解決方法:
現(xiàn)在我們修改一下代碼把表單提交的方法改為post,再運行一次,看看控制臺的打印結(jié)果,html代碼示例:
Java代碼示例:
提交的表單:
控制臺的打印結(jié)果:
可以看到控制臺中的打印結(jié)果出現(xiàn)了不能識別的字符,解決方法很簡單,使用setCharacterEncoding(String)方法,設(shè)置表單提交的數(shù)據(jù)的編碼格式即可:
運行結(jié)果:
注意:除了在Java代碼中需要設(shè)置編碼格式,在html文件中也要設(shè)置好編碼格式,如果html中不設(shè)置編碼格式的話,即便在Java代碼中使用了setCharacterEncoding(String)方法設(shè)置了也沒有用,所以這是雙向的,例如我把html文件中設(shè)置編碼格式的標(biāo)簽給刪掉:
可以看到在網(wǎng)頁上顯示都是亂碼(這是因為Eclipse內(nèi)置的瀏覽器原因,一般市面上的瀏覽器提前預(yù)設(shè)了字符編碼,所以不會出現(xiàn)這種情況)
控制臺打印結(jié)果:
果然出現(xiàn)了不能識別的字符,所以html文件也是需要設(shè)置好編碼的,不然的話就會出現(xiàn)亂碼的情況。
下面來看看瀏覽器的地址欄中為什么能夠顯示中文:
這其實是因為瀏覽器轉(zhuǎn)碼了,可以把這個URL復(fù)制到記事本中:
可以看到是一堆的編碼,并沒有顯示中文,所以實際上瀏覽器就是把這個編碼給轉(zhuǎn)換成了中文而已。
只要不屬于128個字符內(nèi)的字符,在地址欄中都會轉(zhuǎn)換成這種格式的編碼,這些編碼格式是采用的16進制的編碼格式,以上面這文本示例編碼對應(yīng)的中文:
如圖,每一個16進制編碼都是以%開頭,這是utf-8編碼的中文,所以一個中文字對應(yīng)3個16進制編碼。
如果是GBK編碼格式的中文則是一個中文字對應(yīng)2個16進制編碼,但是GBK編碼格式轉(zhuǎn)換成的16進制編碼不能被瀏覽器轉(zhuǎn)換,會仍然顯示著16進制編碼:
中文字對應(yīng)的16進制編碼:
如圖,GBK編碼格式的中文字和utf-8編碼的中文字不一樣,是2個16進制編碼對應(yīng)一個中文字。
關(guān)于客戶端請求數(shù)據(jù)方面的亂碼情況就介紹這么多,另外響應(yīng)數(shù)據(jù)中出現(xiàn)亂碼的情況和解決方法在介紹HttpServletResponse方法部分進行說明。
思維導(dǎo)圖:
HttpServletResponse中的方法
HttpServletResponse接口類型的對象是封裝服務(wù)端響應(yīng)數(shù)據(jù)的,所以這個對象中的方法都是與響應(yīng)數(shù)據(jù)相關(guān)。以下羅列一些常用的方法:
下面使用實際的例子,演示以上方法的使用方式:
編輯響應(yīng)頭一類的方法:
代碼示例:
在服務(wù)端設(shè)置響應(yīng)數(shù)據(jù)的編碼格式是很有必要的,這么做同樣的也是為了避免出現(xiàn)亂碼的問題。例如以下這個示例,我不設(shè)置響應(yīng)數(shù)據(jù)的編碼格式,并輸出一段中文,看看會發(fā)生什么,代碼示例:
運行結(jié)果:
如圖,可以看到,沒有設(shè)置響應(yīng)數(shù)據(jù)的編碼格式的話,輸出中文就會無法被識別。
這種問題設(shè)置一下響應(yīng)數(shù)據(jù)的編碼格式就好了,但是服務(wù)端設(shè)置的編碼格式,要與瀏覽器端的編碼格式對應(yīng)上,如果不對應(yīng)的話仍然會是亂碼,代碼示例:
運行結(jié)果:
添加新的響應(yīng)頭數(shù)據(jù):
代碼示例:
打開TCP/IP Monitor窗口,可以看到以上代碼添加進響應(yīng)頭的數(shù)據(jù):
獲得設(shè)置的響應(yīng)頭信息:
代碼示例:
控制臺打印結(jié)果:
修改響應(yīng)頭信息:
代碼示例:
TCP/IP Monitor窗口:
總結(jié):
解決客戶端表單提交數(shù)據(jù)亂碼的問題,需要使用setCharacterEncoding(String)方法,設(shè)置好與客戶端對應(yīng)的編碼格式。
解決服務(wù)端響應(yīng)數(shù)據(jù)亂碼的問題,則使用setCharacterEncoding(String)方法,設(shè)置好對應(yīng)的編碼格式。
HttpServletRequest是封裝請求數(shù)據(jù)的對象,所以它的方法都是與客戶端請求信息相關(guān)的。
HttpServletResponse是封裝響應(yīng)數(shù)據(jù)的對象,所以它的方法都是與服務(wù)端響應(yīng)信息相關(guān)的。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。