Google

24 Ocak 2006

Tomcat'deki Türkçe karakter sorunu

Tomcat sunucusu kullananlar şöyle bir sorunla karşılaşmışlardır. JSP sayfalarında bulunan bir form aracılığıyla servletlerine post ettikleri metinler eğer Türkçe bir karakter içeriyorsa, bu karakterler ? şeklinde servlete gelir ve JSP sayfalarına aşağıdaki satırın eklenmesi de bu soruna çare olmaz:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

Eğer Apache Tomcat kullanıyor ve Türkçe karakterleri kullanırken sorun yaşıyorsanız, aşağıdaki çözüm derdinize derman olacaktır. Ayrıca, bu çözüm HTML'in standart olarak kabul etmediği karakterleri içeren bütün diller için geçerlidir.

Öncelikle Filter sınıfını implement eden
SetCharacterEncodingFilter ismiyle bir sınıf yazıyoruz. Bu sınıf gelen request'i ayrıştırmak için kullanılacak karakter kodlamasını belirler. Aşağıda bu sınıfın kodu verilmiştir:
package filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;

/**
* Example filter that sets the character encoding to be used in parsing the
* incoming request, either unconditionally or only if the client did not
* specify a character encoding.
*/
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;

/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}

/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}

/**
* Place this filter into service.
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}

/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
* null.
*/
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}

Şimdi de oluşturduğumuz SetCharacterEncodingFilter.java isimli dosyayı "$TOMCAT_HOME/webapps/examples/WEB-INF/classes/filters" dizini altına koyalım.
Son olarak da sıra geldi web.xml'e gerekli satırları yazmaya.Aşağıdaki satırları web.xml dosyamızın web-app tagleri arasına ekliyoruz.

WEB-INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<!-- Example filter to set character encoding on each request -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>
encoding</param-name>
<param-value>
UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>


Tomcat çalışır halde ise yeniden başlatoıyruz ve işte bu kadar. Artık Türkçe karakterleri web uygulamalarınızda gönül rahatlığıyla kullanabilirsiniz.

0 Comments:

Yorum Gönder

<< Home