Java 웹 앱에서 UTF-8을 작동시키는 방법
UTF-8을 지원하기 위해 웹 안 함)에서.äöå
및 사용할 수 있습니다.ЦжФ
특별한 경우를 위해.
설정은 다음과 같습니다.
- 개발 환경: Windows XP
- 생산환경 : Debian
사용된 데이터베이스:MySQL 5.x
사용자는 주로 Firefox2를 사용하지만 Opera 9.x, FF3, IE7, Google 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 요구는 이 영향을 받지 않습니다.
Charset Filter(Charset 필터)
그런 다음 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/whattern을 반환한 부호화.또, 애플리케이션의 각 컨트롤러에 응답 부호화등을 설정하는 방법도 있습니다.
이 필터는 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>
또는 웹 앱의 모든 JSP 페이지 맨 위에 다음을 포함해야 합니다.
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
다른 JSP-fragment를 가진 레이아웃이 사용되는 경우, 모든 JSP-fragment에서 이 레이아웃이 필요합니다.
HTML 메타 태그
JSP 페이지 인코딩은 JSP 페이지의 문자를 올바른 인코딩으로 처리하도록 JVM에 지시합니다.그런 다음 브라우저에 html 페이지의 인코딩 위치를 알려줄 차례입니다.
이 작업은 웹 앱에서 생성되는 각 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 접속이 defiend인 경우 다음과 같이 수행됩니다.
<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 serveri도 구성해야 합니다.일반적으로 이 작업은 my.ini -file을 수정하여 Windows에서 수행하고 my.cnf -file을 설정하여 Linux에서 수행합니다.이러한 파일에서는 서버에 접속되어 있는 모든 클라이언트가 기본 문자 집합으로 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'는 올바르게 처리됩니다.
키릴 문자 is는 latin1에서는 전혀 이해할 수 없습니다.Tomcat은 요청 파라미터를 UTF-8로 처리하도록 지시받았기 때문에 해당 문자를 %D0%B6으로 올바르게 인코딩합니다.
브라우저가 UTF-8 인코딩(요구 헤더 및 html 메타 태그 포함)으로 페이지를 읽도록 지시된 경우 적어도 Firefox 2/3 및 이 기간의 다른 브라우저는 모두 문자 자체를 %D0%B6으로 인코딩합니다.
결과적으로 "Petteri"라는 이름의 모든 사용자가 검색되고 "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에서 문자 is는 %E4로 인코딩됩니다.페이지/요청/모든 것이 UTF-8을 사용하도록 정의되어 있는데도.UTF-8 부호화 버전은 %C3%A4입니다.
그 결과 일부 문자는 latin1로 인코딩되어 있고 다른 문자는 UTF-8로 인코딩되어 있기 때문에 웹 앱은 GET 요청 파라미터를 적절하게 처리할 수 없습니다.주의: 페이지가 UTF-8로 정의되어 있는 경우 브라우저는 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
열을 입력하거나 문자 집합을 사용합니다(MySQL 5.5.3 이상 필요).주의해 주세요.utf8
MySQL은 100%로 되어 있습니다.
Tomcat with Apache
Apache + Tomcat + mod_를 사용하는 경우JK 커넥터도 다음과 같이 변경해야 합니다.
- URIEncoding = """ server에 UTF-8이 "Tomcat server.xml "UTF-8" "에 사용됩니다.mod_mod-mod-mod-mod-mod-mod-mod-mod-mod-mod-mod-mJK 넥 j
<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을 사용하고 있는지 확인할 수도 있습니다.JVM에 대한 파라미터로 -Dfile.encoding=utf-8을 사용합니다(catalina.bat으로 설정할 수 있습니다).
사용자 고유의 Servlet 필터를 쓰는 대신 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
저와 닉을 위해서, 그래서 우리는 그것을 절대 잊지 않고 더 이상 시간을 낭비하지 않습니다.
아주 세밀한 답변입니다.다만, 다른 사람이 동작하고 있는 URL의 UTF-8 인코딩을 확인할 수 있도록 확실히 도움이 되는 것을 하나 더 추가해 주었으면 합니다.
파이어폭스의 URL 로 UTF-8 인코딩을 유효하게 하려면 , 다음의 순서에 따릅니다.
주소 표시줄에 "about:config"를 입력합니다.
필터 입력 유형을 사용하여 "network.standard-url.encode-query-utf8" 속성을 검색합니다.
- 위의 속성은 기본적으로 false이므로 TRUE로 설정합니다.
- 브라우저를 재시작합니다.
URL 상의 UTF-8 인코딩은 IE6/7/8 및 chrome에서 기본적으로 기능합니다.
이전 답변은 제 문제와 맞지 않았습니다.이것은 Tomcat과 apache mod_proxy_ajp를 사용하여 운영 환경에서만 사용되었습니다.포스트 본문이 ASCII가 아닌 문자를 손실한 날짜:마지막으로 JVM defaultCharset(기본 설치의 US-ASCII:Charset dfset = Charset.default Charset();) 따라서 솔루션은 UTF-8을 기본 문자 집합으로 사용하는 JVM을 실행하는 수식자를 사용하여 Tomcat 서버를 실행했습니다.
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
(이 라인을 카탈리나에 추가합니다.sh 및 service tomcat restart)
Linux 시스템 변수도 변경해야 할 수 있습니다(영구적인 변경을 위해서는 ~/.ditrc 및 ~/.profile을 편집하십시오.https://perlgeek.de/en/article/set-up-a-clean-utf8-environment)를 참조하십시오).
LC_ALL=en_US를 내보냅니다.UTF-8
LANG=en_ 내보내기UTF-8language=en_US를 내보냅니다.UTF-8
저도 비슷한 문제가 있지만, 파일 이름에서 아파치 커먼스로 압축하고 있습니다.그래서 다음 명령으로 해결했습니다.
convmv --notest -f cp1252 -t utf8 * -r
저한테는 아주 잘 먹혀요.누구에게나 도움이 되길 바란다.
메시지 번들에서 유니코드 문자를 표시하는 경우 jsp 페이지에 유니코드를 표시하기 위해 "JSP 페이지 인코딩" 섹션을 적용할 필요가 없습니다.Charset Filter 섹션만 있으면 됩니다.
아직 언급되지 않은 다른 한 가지 포인트는 Ajax와 함께 작업하는 Java Servlet에 관한 것입니다.웹 페이지가 이것을 Servlet으로 전송되는 URI에 포함된 JavaScript 파일로 전송되는 사용자로부터 utf-8 텍스트를 수신하는 경우가 있습니다.Servlet은 데이터베이스를 쿼리하고 결과를 캡처한 후 JavaScript 파일로 XML로 반환하며 JavaScript 파일은 포맷된 응답을 원래 웹 페이지에 삽입합니다.
한 웹 앱에서 나는 URI를 구성할 때 JavaScript를 마무리하는 초기 Ajax 책의 지침을 따르고 있었다.이 책의 예에서는 excape() 메서드를 사용했는데, (어렵게) 잘못된 것을 발견했습니다.utf-8의 경우 인코딩을 사용해야 합니다.URIC 컴포넌트().
요즘은 아약스를 직접 운영하는 사람이 거의 없는 것 같은데, 이걸 추가하는 게 나을 것 같아서요.
대해서CharsetFilter
@commendant answer ...에 기재되어 있습니다.
에 빌드가 있다Filter
Tomcat에서web.xml
(장소:conf/web.xml
필터에 이름이 붙습니다.setCharacterEncodingFilter
디폴트로는 코멘트가 붙습니다.코멘트를 해제할 수 있습니다(코멘트를 해제하는 것을 잊지 말아 주세요).filter-mapping
~도)
또한 설정할 필요가 없습니다.jsp-config
당신의 안에서web.xml
(Tomcat 7+용으로 테스트하고 있습니다).
MySQL Administrator 마법사를 통해 문제를 해결할 수 있습니다.인
스타트업 변수 > 상세 >
및 Def. char Set 설정: utf8
이 구성을 사용하려면 MySQL을 다시 시작해야 합니다.
봄 MVC 5 + Tomcat 9 + JSP에서도 같은 문제가 발생.
오랜 조사 끝에 우아한 솔루션에 도달했습니다(8.0.0-RC3 버전부터) Tomcat server.xml에서는 필터도 필요 없고 변경도 필요 없습니다).
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 */ }
Dispatcher Servlet에서Initializer 구현 @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 인코딩으로 저장합니다.
<%@ 페이지 내용 추가유형="text/html;charset="UTF-8" %> 또는 <%@pageEncoding="각 *.jsp 파일에 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
'programing' 카테고리의 다른 글
Set을 String으로 변환하는 방법[ ] (0) | 2022.07.10 |
---|---|
"Unable to access jarfile" 오류의 원인은 무엇입니까? (0) | 2022.07.10 |
Python에서 C/C++를 호출하시겠습니까? (0) | 2022.07.10 |
노드 모듈이 있는 경우 '@vue/cli-plugin-babel' 모듈 때문에 vue-cli-service가 충돌할 수 있습니까? (0) | 2022.07.10 |
Nuxt, Vuex 저장소를 별도의 파일로 분할하면 오류가 발생함: 알 수 없는 변환 유형: 로그인 (0) | 2022.07.10 |