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標簽中加上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即可,當然,我不敢包證,但是我的就是這么處理然后就可以了。
然后是log4j的日志打印亂碼,這個亂碼也是打印在tomcat控制臺的時候亂碼,但是日志文件卻不會,而且我本地測試的時候打印也不會亂碼
而且我配置的也是utf-8,這個曾經(jīng)讓我惱火好久,后面我偶然在一篇博客上發(fā)現(xiàn),說有些服務(wù)器你配utf-8是不行的,他的是編碼就是GBK,我就權(quán)當試試,沒想到還真是這個問題,這也是讓我很無語,,,,
然后就是http請求的亂碼,我這個亂碼問題是我在shiro判斷是否登錄的時候,因為我是前后端分離,所以我shiro判斷未登錄的時候,是返回狀態(tài)碼和提示信息,而不是跳轉(zhuǎn)登錄頁面,我用response返回中文提示信息是,結(jié)果返回的是亂碼,可是我明明設(shè)置了
res.setCharacterEncoding("utf-8");
可是到前端頁面的時候還是亂碼了,這讓我很費解,后面我仔細想了下,我服務(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è)置了默認就是utf-8的編碼,然后我說要配置數(shù)據(jù)庫的默認編碼,修改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ù)庫斗,其樂無窮;與瀏覽器斗,其樂無窮啊
文亂碼問題是比較常見和煩人的問題,本文通過一個小程序介紹了如何通過Servlet從上一個頁面獲取參數(shù),
方法很簡單:調(diào)用request.getParameter(String s)方法。
解決中文亂碼問題的方法是:
首先要設(shè)置response響應(yīng)的格式:response.setContextType("text/html;charSet=GBK");
然后在加上request.setCharacterEncoding("GBK")
需要注意的是這是解決post方式提交的內(nèi)容的中文亂碼問題。
解決get方式提交內(nèi)容的中文亂碼問題的方法:
在Tomcat->conf文件夾->server.xml-->connecter標簽里加上:
URIEncoding="GBK"(注意:在xml里面“=”兩邊不要有空格)
關(guān)于Post和Get之間的區(qū)別可以看我轉(zhuǎn)載的另一篇博文:
HTTP POST GET 本質(zhì)區(qū)別詳解
例子:
1.threeparams.html
2.ThreeParams.java
補充:
上面的這個例子.html中每個name都不一樣,如果有多個一樣的name時,可以按如下的方法來獲取:
1)Enumeration paramNames = request.getParameterNames()
調(diào)用此方法獲得所有參數(shù)的名字,返回一個Enumeration
2) while(paramNames.hasMoreElements()){
String paramName = (String)paramNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
...
時為了在文檔中插入其他內(nèi)容,我們一般會將內(nèi)容導(dǎo)出成網(wǎng)頁后再以超鏈接的形式添加,但有時將PDF轉(zhuǎn)成HTML網(wǎng)頁后,原來文檔中的表格排版卻全亂了是怎么回事?
比如下圖所示,原文檔是一個簡單的含表格的PDF文檔,轉(zhuǎn)出來HTML后卻成了每行一個字,排版亂的沒法看:
那么如何有效避免這種情況并完整的將PDF文檔轉(zhuǎn)成一樣的網(wǎng)頁呢?
首先用極速PDF編輯器打開PDF文檔,接著選擇工具欄中的“超鏈接工具”并按住鼠標左鍵選中表格區(qū)域;
然后在彈出的“鏈接屬性”窗口中的“類型”下拉選項中選擇“表格框”,并根據(jù)文檔內(nèi)容設(shè)置應(yīng)用頁面范圍后,點擊“確定”即可。
回到文檔頁面可以看到框選的表格區(qū)域出現(xiàn)藍色的超鏈接標識,這時就已經(jīng)做好了,接下來驗證下效果。
先選擇工具欄中的“手形工具”后,在文檔處右擊選擇“導(dǎo)出”—“頁面為”
接著根據(jù)頁面提示設(shè)置要導(dǎo)出為HTML網(wǎng)頁的頁面范圍后,點擊右側(cè)的確定即可。
這時再次打卡導(dǎo)出的網(wǎng)頁可以看到表格被完整且保留原格式導(dǎo)出。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。