Java webapp에서 UTF-8을 작동시키는 방법은 무엇입니까?
Java 웹 응용 프로그램 (서블릿 + JSP, 프레임 워크 사용 안 함)에서 UTF-8을 사용 하여 특수한 경우 äöå
와 같은 일반 핀란드어 텍스트 및 키릴 자모 등 을 지원해야합니다 ЦжФ
.
내 설정은 다음과 같습니다.
- 개발 환경 : Windows XP
- 프로덕션 환경 : 데비안
사용 된 데이터베이스 : MySQL 5.x
사용자는 주로 Firefox2를 사용하지만 Opera 9.x, FF3, IE7 및 Chrome도 사이트에 액세스하는 데 사용됩니다.
이것을 달성하는 방법?
이 사이트의 FAQ로 나 자신에게 대답하면 좋습니다. 이것은 나를 위해 작동합니다 :
대부분의 문자 äåö는 문제가되지 않습니다. 웹 애플리케이션에 대해 브라우저 및 tomcat / java에서 사용하는 기본 문자 세트는 latin1입니다. 이러한 문자를 "이해"하는 ISO-8859-1.
Java + Tomcat + Linux / Windows + Mysql에서 UTF-8을 작동 시키려면 다음이 필요합니다.
Tomcat의 server.xml 구성
커넥터가 UTF-8을 사용하여 URL (GET 요청) 매개 변수를 인코딩하도록 구성해야합니다.
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
compression="on"
compressionMinSize="128"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
URIEncoding="UTF-8"
/>
위 예제에서 핵심 부분은 URIEncoding = "UTF-8" 입니다. Tomcat은 들어오는 모든 GET 매개 변수를 UTF-8로 인코딩하여 처리합니다. 결과적으로 사용자가 브라우저의 주소 표시 줄에 다음을 쓸 때 :
https://localhost:8443/ID/Users?action=search&name=*ж*
문자 ж는 UTF-8로 처리되며 (일반적으로 서버에 도달하기 전에 브라우저에 의해) % D0 % B6 으로 인코딩됩니다 .
POST 요청은 이에 영향을받지 않습니다.
CharsetFilter
이제 java webapp가 UTF-8로 인코딩 된 모든 요청과 응답을 처리하도록 할 차례입니다. 이를 위해서는 다음과 같은 문자 집합 필터를 정의해야합니다.
package fi.foo.filters;
import javax.servlet.*;
import java.io.IOException;
public class CharsetFilter implements Filter {
private String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("requestEncoding");
if (encoding == null) encoding = "UTF-8";
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
throws IOException, ServletException {
// Respect the client-specified character encoding
// (see HTTP specification section 3.4.1)
if (null == request.getCharacterEncoding()) {
request.setCharacterEncoding(encoding);
}
// Set the default response content type and encoding
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
next.doFilter(request, response);
}
public void destroy() {
}
}
이 필터는 브라우저가 요청에 사용 된 인코딩을 설정하지 않은 경우 UTF-8로 설정되어 있는지 확인합니다.
이 필터가 수행하는 다른 작업은 기본 응답 인코딩을 설정하는 것입니다. 돌려 주어진 html / 무엇이든 인코딩 대안은 응용 프로그램의 각 컨트롤러에서 응답 인코딩 등을 설정하는 것입니다.
이 필터는 web.xml 또는 webapp의 배치 디스크립터에 추가해야합니다 .
<!--CharsetFilter start-->
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>fi.foo.filters.CharsetFilter</filter-class>
<init-param>
<param-name>requestEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
이 필터를 만드는 방법은 tomcat wiki ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )에 있습니다.
JSP 페이지 인코딩
당신의에서 web.xml에 다음을 추가합니다 :
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
또는 webapp의 모든 JSP 페이지 상단에 다음이 있어야합니다.
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
다른 JSP-fragments를 가진 어떤 종류의 레이아웃이 사용된다면, 이것들 모두 에 필요 합니다.
HTML- 메타 태그
JSP 페이지 인코딩은 JVM이 JSP 페이지의 문자를 올바른 인코딩으로 처리하도록 지시합니다. 그런 다음 html 페이지를 인코딩하는 브라우저를 알려야합니다.
이것은 webapp에 의해 생성 된 각 xhtml 페이지의 맨 위에 다음과 같이 수행됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi">
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
...
JDBC 연결
db를 사용할 때는 연결에 UTF-8 인코딩이 사용되도록 정의해야합니다. 이 작업은 context.xml 또는 JDBC 연결이 다음과 같은 경우에 수행됩니다.
<Resource name="jdbc/AppDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="20" maxIdle="10" maxWait="10000"
username="foo"
password="bar"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/ ID_development?useEncoding=true&characterEncoding=UTF-8"
/>
MySQL 데이터베이스 및 테이블
사용 된 데이터베이스는 UTF-8 인코딩을 사용해야합니다. 이것은 다음을 사용하여 데이터베이스를 작성함으로써 달성됩니다.
CREATE DATABASE `ID_development`
/*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;
그런 다음 모든 테이블은 UTF-8이어야합니다.
CREATE TABLE `Users` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(30) collate utf8_swedish_ci default NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC;
키 부분은 CHARSET = utf8 입니다.
MySQL 서버 구성
MySQL 서버도 구성해야합니다. 일반적으로이 작업은 Windows에서 my.ini 파일 을 수정 하고 Linux에서 my.cnf 파일 을 구성 하여 수행됩니다 . 이러한 파일에서 서버에 연결된 모든 클라이언트는 utf8을 기본 문자 세트로 사용하고 서버에서 사용하는 기본 문자 세트도 utf8로 정의해야합니다.
[client]
port=3306
default-character-set=utf8
[mysql]
default-character-set=utf8
MySQL의 절차 및 기능
또한 문자 세트를 정의해야합니다. 예를 들면 다음과 같습니다.
DELIMITER $$
DROP FUNCTION IF EXISTS `pathToNode` $$
CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8
READS SQL DATA
BEGIN
DECLARE path VARCHAR(255) CHARACTER SET utf8;
SET path = NULL;
...
RETURN path;
END $$
DELIMITER ;
GET 요청 : latin1 및 UTF-8
Tomcat의 server.xml에 GET 요청 매개 변수가 UTF-8로 인코딩되어 정의 된 경우 다음 GET 요청이 올바르게 처리됩니다.
https://localhost:8443/ID/Users?action=search&name=Petteri
https://localhost:8443/ID/Users?action=search&name=ж
ASCII 문자는 latin1 및 UTF-8과 동일한 방식으로 인코딩되므로 문자열 "Petteri"가 올바르게 처리됩니다.
키릴 문자 ж는 라틴어로 전혀 이해되지 않습니다. Tomcat은 요청 매개 변수를 UTF-8로 처리하도록 지시되었으므로 해당 문자를 % D0 % B6 으로 올바르게 인코딩합니다 .
브라우저가 UTF-8 인코딩 (요청 헤더 및 HTML 메타 태그 포함)으로 페이지를 읽도록 지시받은 경우,이 기간의 Firefox 2/3 및 기타 브라우저는 모두 문자 자체를 % D0 % B6 으로 인코딩합니다 .
결과적으로 이름이 "Petteri"인 모든 사용자가 발견되고 이름이 "ж"인 모든 사용자가 발견됩니다.
그러나 äåö는 어떻습니까?
HTTP 사양은 기본적으로 URL이 latin1로 인코딩되도록 정의합니다. 이로 인해 firefox2, firefox3 등이 다음을 인코딩합니다.
https://localhost:8443/ID/Users?action=search&name=*Päivi*
인코딩 된 버전으로
https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*
latin1에서 문자 ä 는 % E4 로 인코딩됩니다 . page / request / everything이 UTF-8을 사용하도록 정의되었지만 . ä의 UTF-8 인코딩 버전은 % C3 % A4입니다.
그 결과 일부 문자는 latin1로 인코딩되고 다른 문자는 UTF-8로 인코딩되므로 웹 응용 프로그램이 GET 요청의 요청 매개 변수를 적절하게 처리하는 것이 불가능합니다. 참고 : 페이지가 UTF-8로 정의 된 경우 POST 요청은 브라우저가 양식의 모든 요청 매개 변수를 UTF-8로 완전히 인코딩하므로 작동합니다.
읽을 거리
내 문제에 대한 답변을 해준 다음 작가들에게 대단히 감사합니다.
- http://tagunov.tripod.com/i18n/i18n.html
- http://wiki.apache.org/tomcat/Tomcat/UTF-8
- http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
- http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
- http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
- http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
- http://jeppesn.dk/utf-8.html
- http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-td18720039.html
- http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html
- http://www.utf8-chartable.de/
중요 사항
mysql 은 3 바이트 UTF-8 문자를 사용 하는 기본 다국어 플레인 을 지원합니다 . 그 밖에 나가야하는 경우 (일부 알파벳은 3 바이트 이상의 UTF-8이 필요합니다), 다양한 VARBINARY
열 유형을 사용하거나 utf8mb4
문자 집합 을 사용해야합니다 (MySQL 5.5.3 이상이 필요함). utf8
MySQL 에서 문자 집합 을 사용하면 100 % 작동하지 않습니다.
아파치와 Tomcat
한 가지 더 Apache + Tomcat + mod_JK 커넥터를 사용하는 경우 다음 변경도 수행해야합니다.
- 8009 커넥터의 tomcat server.xml 파일에 URIEncoding = "UTF-8"을 추가하십시오 (mod_JK 커넥터에서 사용됨).
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
- 아파치 폴더 즉 고토
/etc/httpd/conf
을 추가AddDefaultCharset utf-8
에서httpd.conf file
. 참고 : 먼저 존재하는지 확인하십시오. 존재하는 경우이 줄로 업데이트 할 수 있습니다. 이 줄을 맨 아래에 추가 할 수도 있습니다.
나는 당신이 당신의 대답으로 그것을 잘 요약했다고 생각합니다.
UTF-8-ing (?) 프로세스의 끝에서 끝까지 Java 자체가 UTF-8을 사용하고 있는지 확인할 수도 있습니다. -Dfile.encoding = utf-8을 JVM의 매개 변수로 사용하십시오 (catalina.bat에서 구성 가능).
kosoant의 답변에 추가하기 위해 자체 서블릿 필터를 작성하지 않고 Spring을 사용하는 org.springframework.web.filter.CharacterEncodingFilter
경우 제공 하는 클래스 를 사용 하여 web.xml에서 다음과 같이 구성 할 수 있습니다 .
<filter>
<filter-name>encoding-filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>FALSE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
여기 에서이 부분 을 추가하고 utf 문제를 해결하고 싶습니다.
runtime.encoding=<encoding>
Java를 사용하여 액세스하려는 경우 MySql 테이블의 그리스어 인코딩을위한 것입니다.
JBoss 연결 풀 (mysql-ds.xml)에서 다음 연결 설정을 사용하십시오.
<connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>nts</user-name>
<password>xaxaxa!</password>
<connection-property name="useUnicode">true</connection-property>
<connection-property name="characterEncoding">greek</connection-property>
이것을 JNDI 연결 풀에 넣지 않으려면 다음 행과 같이 JDBC URL로 구성 할 수 있습니다.
jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek
나와 Nick에게는 더 이상 잊지 않고 시간을 낭비하지 않습니다 .....
좋은 자세한 답변. 다른 사람들이 URL에서 UTF-8 인코딩을 볼 수 있도록 확실히 도와주는 것을 하나 더 추가하고 싶었습니다.
firefox의 URL에서 UTF-8 인코딩을 활성화하려면 아래 단계를 따르십시오.
주소 표시 줄에 "about : config"를 입력하십시오.
필터 입력 유형을 사용하여 "network.standard-url.encode-query-utf8"특성을 검색하십시오.
- 위의 속성은 기본적으로 false이며 TRUE로 설정하십시오.
- 브라우저를 다시 시작하십시오.
URL의 UTF-8 인코딩은 기본적으로 IE6 / 7 / 8 및 크롬에서 작동합니다.
비슷한 문제가 있지만 파일의 파일 이름에서 아파치 공통점으로 압축하고 있습니다. 그래서이 명령으로 해결했습니다.
convmv --notest -f cp1252 -t utf8 * -r
그것은 나를 위해 아주 잘 작동합니다. 그것이 누군가를 돕기를 바랍니다.)
메시지 번들에서 유니 코드 문자를 표시하는 경우에는 jsp 페이지에 유니 코드를 표시하기 위해 "JSP 페이지 인코딩"섹션을 적용 할 필요가 없습니다. 필요한 것은 "CharsetFilter"섹션입니다.
언급되지 않은 또 다른 요점은 Ajax를 사용하는 Java 서블릿과 관련이 있습니다. 웹 페이지가 서블릿으로 전송 된 URI에 포함 된 JavaScript 파일로이를 전송하는 사용자로부터 utf-8 텍스트를 선택하는 상황이 있습니다. 서블릿은 데이터베이스를 쿼리하고 결과를 캡처하여이를 XML 형식의 JavaScript 파일로 리턴하여이를 형식화하고 형식화 된 응답을 원래 웹 페이지에 삽입합니다.
한 웹 응용 프로그램에서 URI를 구성 할 때 JavaScript를 래핑하는 초기 Ajax 책의 지침을 따르고있었습니다. 이 책의 예제는 escape () 메소드를 사용했는데, 내가 발견 한 것은 어렵다. utf-8의 경우 encodeURIComponent ()를 사용해야합니다.
요즘 자신의 Ajax를 굴리는 사람은 거의 없지만 이것을 추가 할 수도 있다고 생각했습니다.
CharsetFilter
@kosoant 답변에서 언급 한 내용 ....
Filter
바람둥이 web.xml
(에 위치 conf/web.xml
) 에 빌드가 있습니다 . 필터의 이름이 지정 setCharacterEncodingFilter
되고 기본적으로 주석 처리됩니다. 당신은 이것을 주석 해제 할 수 있습니다 (댓글 filter-mapping
도 주석 해제해야 함 )
또한 설정할 필요가 없습니다 jsp-config
에이 web.xml
(내가 톰캣에 대한 테스트가 7+)
언젠가 MySQL 관리자 마법사를 통해 문제를 해결할 수 있습니다. 에
시작 변수> 고급>
방어력을 설정합니다. 문자 세트 : utf8
이 구성은 MySQL을 다시 시작해야 할 수도 있습니다.
이전 답변은 내 문제와 함께 작동하지 않았습니다. 그것은 바람둥이와 아파치 mod_proxy_ajp와 함께 생산에만있었습니다. Post body는 비 ascii 문자를 잃어 버렸습니까? 문제는 마침내 JVM defaultCharset (기본 설치의 US-ASCII : Charset dfset = Charset.defaultCharset ();)에 있었으므로 솔루션은 UTF-8을 기본 문자 세트로 사용하여 JVM을 실행하는 수정 자와 함께 tomcat 서버를 실행했습니다.
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
(catalina.sh에이 줄을 추가하고 tomcat 서비스를 다시 시작하십시오)
Linux 시스템 변수도 변경해야 할 수도 있습니다 (영구적 변경을 위해 ~ / .bashrc 및 ~ / .profile 편집, https://perlgeek.de/en/article/set-up-a-clean-utf8-environment 참조 ).
LC_ALL = en_US.UTF-8
내보내기 LANG = en_US.UTF-8 내보내기LANGUAGE = en_US.UTF-8 내보내기
Spring MVC 5 + Tomcat 9 + JSP에서 동일한 문제에 직면했습니다.
오랜 연구 후, 우아한 솔루션 (온 더 필요의 필터 와 전혀 필요의 변화 톰캣의 server.xml에이 (8.0.0-RC3 버전에서 시작하지 않음))
WebMvcConfigurer 구현에서 messageSource (UTF-8 인코딩의 메시지 소스 파일에서 데이터를 읽기위한)의 기본 인코딩을 설정하십시오.
@Configuration @EnableWebMvc @ComponentScan("{package.with.components}") public class WebApplicationContextConfig implements WebMvcConfigurer { @Bean public MessageSource messageSource() { final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } /* other beans and methods */ }
DispatcherServletInitializer 구현에서 @ onStartup 메소드를 대체하고 요청 및 자원 문자 인코딩을 설정하십시오.
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override public void onStartup(final ServletContext servletContext) throws ServletException { // https://wiki.apache.org/tomcat/FAQ/CharacterEncoding servletContext.setRequestCharacterEncoding("UTF-8"); servletContext.setResponseCharacterEncoding("UTF-8"); super.onStartup(servletContext); } /* servlet mappings, root and web application configs, other methods */ }
모든 메시지 소스를 저장하고 파일을 UTF-8 인코딩으로보십시오.
각 * .jsp 파일에 <% @ page contentType = "text / html; charset = UTF-8"%> 또는 <% @ page pageEncoding = "UTF-8"%>를 추가 하거나 web.xml에 jsp-config 설명자를 추가하십시오.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>AppName</display-name> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config> </web-app>
연결 풀 (mysql-ds.xml)에 지정된 경우 Java 코드에서 다음과 같이 연결을 열 수 있습니다.
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
"jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek",
"Myuser", "mypass");
참고 URL : https://stackoverflow.com/questions/138948/how-to-get-utf-8-working-in-java-webapps
'development' 카테고리의 다른 글
참조 대 포인터를 사용하는 경우 (0) | 2020.02.28 |
---|---|
Gadaffi를 검색하는 정규식 (0) | 2020.02.28 |
여러 클래스를 가진 Java Generics 와일드 카드 (0) | 2020.02.28 |
NoClassDefFoundError와 ClassNotFoundException의 차이점은 무엇입니까? (0) | 2020.02.28 |
모든 열을 정렬 (0) | 2020.02.28 |