`

tomcat乱码问题

阅读更多
解決 Tomcat 5.0.19 中文參數傳遞問題 [精華]
精靈





發文: 73
積分: 7
於 2004-04-14 02:07 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
實際運用 Tomcat 5.0.19,我們了解在不修改 Tomcat 原始碼的狀況下,使用者透過 Form submit 的資料將一律以 ISO8859-1 處理,程式設計師必須自行將字串將轉換為 Big5(繁體中文) or GB2312/GBK(簡體中文),我們在應用程式中,對所有的 request.getParameter("xx"); 作了 toBig5String() 的處理,理論上,所有的中文問題應該不會出現才對,結果,還是發現某些狀況下,中文還是變成亂碼!

經過分析整理,我們發現問題出在 QueryString 的解析,以前在 Tomcat 4.x 時代,無論 SUBMIT 時採用 GET or POST,Tomcat server 對 parameters 的處理都採用相同的編碼,但在 Tomcat 5.x 版,不知何故,卻將 QueryString 的解析獨立出來,目前確認,Form 的 Method 採用 GET 及直接將參數寫在 URL 上的中文,上傳到 Tomcat 時,無論如何轉碼,都會變成亂碼,那怕你事先作過 URLEncode 也一樣。

網站上,有人針對這個問題,建議將所有中文改採用 base64 編碼,到了 server 上,程式將自行土 base64 decode 回來,確保中文不會發生問題。這樣作法當然可以解決這個問題,但是所有網頁變成限定要採用 POST,且程式設計師要隨時分清楚,那個參數是採用 GET 上傳,那個參數是採用 POST 上傳,然後再針對不同的方式採用不同的解析,這樣的程式一點兒移植性都沒有,更別提跨平台、跨國際語言了。

研究 Tomcat 的文件及原始碼,我們找到了問題所在及解決的方法,只有按著以下的作法,才能使 Form submit 的資料完全按著 ISO8859-1 的編碼,當然,若是全照著 Tomcat 的文件說明去作,肯定還是不行,你還是得加上這個參數到 server.xml 中才行。

解決方案

請先研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html 這個說明檔,擷錄重點如下:
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

useBodyEncodingForURI:This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitely set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.

上述二個 Tomcat 參數,是設定在 server.xml 中的 http <Connector /> 區塊,要解決 QueryString 中文變成亂碼的問題,你必須至少設定這二個參數其中之一。
URIEncoding 請設定為 URIEncoding="ISO-8859-1" 指定為 "ISO-8859-1" 編碼,讓 QueryString 的字元編碼與 post body 相同。
useBodyEncodingForURI 這是用來相容 Tomcat 4.x 版的,設定的值是 "true" or "false",意思是指 "要不要讓 QueryString 與 POST BODY 採用相同的字元編碼 ?",若是設成 true,那也可達到 "ISO-8859-1" 編碼的需求。
建議,採用 URIEncoding 的設定,畢竟 useBodyEncodingForURI 的作法是為了相容 Tomcat 4.X。不過若照原文的說明,理論上這二個參數都不設,Tomcat 也該採用 "ISO-8859-1" 的編碼,那為什麼還是會有問題呢 ? 我們由 Tomcat Source Code 來看就清楚了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 這一段碼是 Tomcat 用來解 QueryString 的程式,
// 在 org.apache.tomcat.util.http.Parameters 這個 class 裡。
private String urlDecode(ByteChunk bc, String enc)
  throws IOException {
  if( urlDec==null ) {
     urlDec=new UDecoder(); 
  }
  urlDec.convert(bc);
  String result = null;
  if (enc != null) {
    bc.setEncoding(enc);
    result = bc.toString();
  } 
  else {
    CharChunk cc = tmpNameC;
    cc.allocate(bc.getLength(), -1);
    // Default encoding: fast conversion
    byte[] bbuf = bc.getBuffer();
    char[] cbuf = cc.getBuffer();
    int start = bc.getStart();
    for (int i = 0; i < bc.getLength(); i++) {
      cbuf[i] = (char) (bbuf[i + start] & 0xff);
    }
    cc.setChars(cbuf, 0, bc.getLength());
    result = cc.toString();
    cc.recycle();
  }
  return result;
}

請特別注意紅色區塊,當 Tomcat 發現 QueryString 並沒有設定 encode 時,並非像文件中所說預設採用 ISO-8859-1 的編碼,而是用一段 fast conversion 來處理,才會造成中文問題,所以,還是必須在 Server.xml 中,加上 URLEncoding 的參數設定才行哦。

Connector 的設定範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="ISO-8859-1"
>
</Connector>


browser edited on 2004-04-14 02:22

<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=17&id=180564" target="_blank"><font color="#808080">SCWCD 96/1/14 90% PASS<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
browser

戀香

版主

發文: 3510
積分: 1
於 2004-04-14 02:40 user profilesend a private message to usersend email to browserreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
太好了 .... Thumbs up
十分感謝 精靈 兄整理的這份資料 ...
這份文件是 Tomcat 5.0.19 中文參數傳遞的正解 ...
原本當初也想在書中特別提出來介紹的,但是當時己經進入排版階段 .. Disapproved

在這邊我做幾項補充 ...
一般說來,我們在使用 Tomcat 4 透過 GET or POST 的方式傳參數時,通常都是使用 Filter 的方式來解決中文傳參數的問題。
但是到了 Tomcat 5.0.19 之後,解決中文傳遞參數時,就必須考慮是使用 GET or POST,兩種解決的方式不一樣。

如果是使用 GET 的方式傳遞時,就如同 精靈 兄 的文章所述,或者使用

1
String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"),"Big5");


;若是使用 POST 的方式時,就延用傳統一般解決中文的方式

1
request.setCharacterEncoding("Big5");


不過當初我最後的做法是使用 Filter 的方式
Filter 的做法就是:先判斷是使用那種傳遞方式( GET or POST),假若是用 GET 的方式就採用第一種 code;若使用POST 方式,就採用第二種 code。


browser edited on 2005-03-16 15:15


作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
發條盒子

問問題的麻煩傢伙



發文: 120
積分: 0
於 2004-04-16 01:05 user profilesend a private message to usersend email to 發條盒子reply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
request.setCharacterEncoding("Big5");
我用這一行可以解決get和post的問題,這是為什麼呢?
反而我去設定了URIEncoding="ISO-8859-1"卻沒有什麼用也
環境tomcat5.0.16+j2sdk1.4.2_03+windows xp


browser edited on 2004-04-16 01:07

如果我能學好jsp就好了
我是新手,希望大家體諒我問的問題太白痴^^
買書買到沒有錢錢
<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=14&id=180587" target="_blank"><font color="#808080">到底是不是用oracle数据库比较好<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
jan





發文: 47
積分: 0
於 2004-05-07 16:04 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
我在server.xml中依照精靈前輩所說的這個設定修改了Connector Tag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="ISO-8859-1">
</Connector>

SUBMIT中文時採用GET的方式依然結取到亂碼耶~~
請問還有要注意什麼嗎?

我的平台:
OS : Windows2003 Server
SDK : Sun SDK 1.4.2_03-b02
Tomcat 5.0.19


jan edited on 2004-05-07 16:20

<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=15&id=180917" target="_blank"><font color="#808080">美商軟體公司 徵 Sales[台北南京東]<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:jan]
browser

戀香

版主

發文: 3510
積分: 1
於 2004-05-07 16:25 user profilesend a private message to usersend email to browserreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
jan wrote:
我在server.xml中依照精靈前輩所說的這個設定修改了Connector Tag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="ISO-8859-1">
</Connector>

SUBMIT中文時採用GET的方式依然結取到亂碼耶~~
請問還有要注意什麼嗎?

我的平台:
OS : Windows2003 Server
SDK : Sun SDK 1.4.2_03-b02
Tomcat 5.0.19


我是使用 URIEncoding="Big5" Smile




<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=41&id=180491" target="_blank"><font color="#808080">請問一下relationTable新增的問題<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
plutotw

井底蛙



發文: 358
積分: 2
於 2004-05-09 17:43 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
我們老師提的解決方案,用
1
URIEncoding="MS950"

測試結果在 windows 上是正常的



<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=5&id=180788" target="_blank"><font color="#808080">java中的类型是什么类型?????<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
senshaw





發文: 1
積分: 0
於 2004-06-12 18:55 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
感謝~我發現tomcat 5中文參數問題後,遲遲不敢升級,現在見到曙光了Big Smile


<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=15&id=180500" target="_blank"><font color="#808080">"急徵" JAVA/J2ME/BREW人才招募(薪優)(英商)<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:browser]
sindylee





發文: 1
積分: 0
於 2004-07-14 17:21 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
請問若是在filter判斷是否為GET 或 POST 的話, 那麼
若是 POST method, 則可直接用 request.setCharacterEncoding 做掉,
若是 GET method, 該如何將處理完的結果存回 request , 然後傳送到 JSP
中呢? 因為不想在每支JSP 中去判斷及處理



<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=11&id=180873" target="_blank"><font color="#808080">Jakarta Commons Digester (for read xml)<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
hcl





發文: 6
積分: 0
於 2004-07-16 13:09 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
想請教各位先進,小弟我依照上述方式改了設定,但是圖檔連結的檔名
是中文,那在TOMCAT5.0.19上面無法顯示,想請問一下該如何處理呢?
1
<img src="中文檔名" />

環境:
WINDOWS 2000 SP4 + TOMCAT5.0.19 + IIS 5.0


hcl edited on 2004-07-16 15:47

<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=15&id=180500" target="_blank"><font color="#808080">"急徵" JAVA/J2ME/BREW人才招募(薪優)(英商)<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
prf





發文: 1
積分: 0
於 2004-08-16 11:05 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
好贴。


<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=29&id=180947" target="_blank"><font color="#808080">不會吧~1.6問題出現在這種地方。<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:hcl]
Jill_Yeh

眾裡尋他千百度



發文: 89
積分: 0
於 2004-09-02 13:45 user profilesend a private message to usersend email to Jill_Yehreply to postsearch all posts byselect and copy to clipboard.
            ie only, sorry for netscape users:-)add this post to my favorite list <!-- hemidemi and delicious --> 收藏文章?del.icio.us|HEMiDEMi|Search 2.0
hcl wrote:
想請教各位先進,小弟我依照上述方式改了設定,但是圖檔連結的檔名
是中文,那在TOMCAT5.0.19上面無法顯示,想請問一下該如何處理呢?
1
<img src="中文檔名" />

環境:
WINDOWS 2000 SP4 + TOMCAT5.0.19 + IIS 5.0


若是搭配 IIS 的話, 不是 JAVA 的皆是由 IIS 來處理
所以你這個 <IMG> 基本上是透過 IIS 在傳遞
接下來就是中文的問題, IIS 理論上沒這個問題, 問題應該出在瀏覽器這端
若是你使用 IE, 則去選項設定那邊查看是否有開啟「永遠將 URL 傳送成 UTF8....」

這是我之前的經驗, 有錯誤請指正 Smile



<!-- <hr noshade size=1 align="left" color="#cccccc"> &#149; <a href="http://www.javaworld.com.tw/jute/post/view?bid=14&id=180754" target="_blank"><font color="#808080">學java可不可以不要學framework<font></a> -->
作者 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 [Re:精靈]
shirley_wang





發文: 3
積分: 0
於 2004-09-21 15:39 user profile ta
评论

相关推荐

    将cmd编码格式永久改为utf-8,解决部署以后tomcat乱码问题

    将cmd编码格式永久改为utf-8,解决部署以后tomcat乱码问题

    Tomcat乱码问题

    ### Tomcat乱码问题及其终极解决方案 在使用Tomcat服务器部署Web应用时,字符编码问题时常困扰着开发者,尤其是在处理中文或特殊字符时,页面显示出现乱码是常见的现象。本文将深入探讨Tomcat乱码问题的原因,并...

    TOMCAT乱码问题

    TOMCAT乱码问题解决方法 TOMCAT乱码问题是jsp网页制作与开发中常见的问题。造成乱码的原因是tomcat对表单提交和GET请求的处理方式不同。Tomcat4和Tomcat5处理乱码的方法不同,在Tomcat5中,需要使用Filter设置字符...

    解决tomcat中文乱码问题

    解决tomcat中文乱码问题,有详细的解释说明,希望对需要的人有所帮助

    idea tomcat乱码问题的解决及相关设置的步骤

    "Idea Tomcat 乱码问题的解决及相关设置的步骤" 本文主要介绍了 Idea Tomcat 乱码问题的解决及相关设置的步骤,通过详细的示例代码,帮助读者了解 Idea Tomcat 乱码问题的解决方法和相关设置的步骤。 一、 Idea ...

    Ubuntu下使用Tomcat搭建网站出现中文乱码的问题.docx

    Ubuntu下使用Tomcat搭建网站出现中文乱码的问题 在 Ubuntu 操作系统下使用 Tomcat 搭建网站时,可能会出现中文乱码的问题。这是由于字符集的不统一所致。为了解决这个问题,需要统一服务器的字符编码,包括 Linux ...

    Docker容器部署tomcat出现中文乱码.docx

    因此,在 Docker 容器中部署 Tomcat 时,中文字符将无法正确显示,导致乱码问题。 解决方案 要解决这个问题,我们可以在 Dockerfile 中添加环境变量,设置 locale 为 en_US.UTF-8。这将使 Docker 容器支持 UTF-8 ...

    解决Tomcat中文乱码

    ### 解决Tomcat中文乱码问题 在使用Tomcat服务器部署Web应用时,经常会遇到中文乱码的问题。本文将详细探讨这一现象的原因,并提供一种有效的解决方案。 #### 问题背景 在Tomcat环境下运行Web应用程序时,如果...

    tomcat显示出现中文乱码问题.docx

    本文将详细介绍如何解决Tomcat中的中文乱码问题。 首先,我们需要理解Tomcat的字符编码处理流程。Tomcat在接收HTTP请求时,会根据`Connector`元素的`useBodyEncodingForURI`属性和`URIEncoding`属性来确定请求参数...

    Tomcat和weblogic中文乱码问题解决方案

    Tomcat和WebLogic中文乱码问题解决方案 在 Java Web 开发中,中文乱码问题一直是困扰开发者的主要问题之一。 Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时...

    关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论

    标题中的“关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论”涉及了两个关键的IT概念:Tomcat服务器的字符编码问题和Java虚拟机(JVM)内存管理的问题。让我们逐一深入探讨这两个主题。 首先,我们来...

    解决tomcat中文乱码问题.doc

    ### 解决Tomcat中文乱码问题 在使用Tomcat服务器部署Web应用时,经常会遇到中文乱码的问题。本文将详细探讨几种常见的乱码场景及其解决方案。 #### 一、JSP页面上的中文显示为乱码 **问题描述**:在JSP页面中直接...

    tomcat 下catalina.out 日志乱码问题处理

    标题中的“tomcat下catalina.out日志乱码问题处理”主要涉及的是在Tomcat服务器运行过程中,输出的日志文件`catalina.out`中,中文字符显示为乱码的状况。这通常是由于字符编码不匹配导致的,因为Tomcat在读取或写入...

    如何解决Tomcat下中文乱码问题?

    在IT行业中,尤其是在Java Web开发领域,Tomcat服务器在处理中文字符时经常遇到乱码问题。这主要涉及两个方面:JSP页面显示中文乱码和表单提交乱码。为了解决这些问题,我们需要理解字符编码的基本原理,并采取相应...

    解决tomcat下中文乱码问题

    解决 Tomcat 下中文乱码问题 在本文中,我们将讨论如何解决 Tomcat 下中文乱码问题。该问题是由于 Tomcat 默认的字符编码设置不正确引起的。我们将通过设置 Connector 元素的 URIEncoding 属性和在过滤器中设置字符...

    IDEA中Tomcat乱码问题

    通过以上步骤,你应该能够解决IDEA中Tomcat的乱码问题。确保每个环节都按照正确顺序进行,以确保所有输出都正确地使用UTF-8编码。如果问题仍然存在,可能需要检查其他可能导致编码问题的设置,例如系统的区域和语言...

    Tomcat环境下JSP中文乱码问题的解决

    ### Tomcat环境下JSP中文乱码问题的解决 #### 引言 在Web开发领域,尤其是在使用JavaServer Pages (JSP)技术与Apache Tomcat服务器的环境中,中文乱码问题一直是一个令人头疼的难题。这不仅影响了用户体验,也增加...

    tomcat值乱码解决

    最近几个项目,都出现了乱码问题。某些通过URL来传送、值为汉字的参数,在页面中显示的是乱码,但是在本地开发环境是正常显示的。排除的因素当然就是服务器的设置不当了,但具体是那些原因呢?一般我们所装的linux...

    springboot乱码问题解决方案

    在SpringBoot项目中,默认情况下,Tomcat服务器使用ISO-8859-1字符编码,而开发者通常使用UTF-8字符编码,导致乱码问题的出现。 二、解决方案 1. 配置文件中添加编码设置 在application.properties或application....

Global site tag (gtag.js) - Google Analytics