문제

지원하기 위해 Java WebApp (Servlets + JSP, Framework No Framework)에서 UTF-8을 작동시켜야합니다. äöå 등. 일반 핀란드어 텍스트 및 사이릴 릭 알파벳과 같은 경우 ЦжФ 특별한 경우.

내 설정은 다음과 같습니다.

  • 개발 환경 : Windows XP
  • 생산 환경 : 데비안

사용 된 데이터베이스 : MySQL 5.x

사용자는 주로 Firefox2를 사용하지만 Opera 9.x, FF3, IE7 및 Google Chrome도 사이트에 액세스하는 데 사용됩니다.

이것을 달성하는 방법?

도움이 되었습니까?

해결책

이 사이트의 FAQ로 자신을 대답하면이를 권장합니다. 이것은 나를 위해 작동합니다 :

대부분의 문자 äåö는 브라우저에서 사용하는 기본 문자 세트와 WebApps의 Tomcat/Java가 Latin1 IE로 문제가되지 않습니다. ISO-8859-1은 그 캐릭터를 "이해"합니다.

Java+Tomcat+Linux/Windows+MySQL에서 UTF-8 작업을 수행하려면 다음이 필요합니다.

Tomcat의 Server.xml 구성

커넥터가 UTF-8을 사용하여 URL을 인코딩 (GET Request) 매개 변수를 구성하도록 구성해야합니다.

<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.

사후 요청은 이것의 영향을받지 않습니다.

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로 설정되어 있는지 확인합니다.

이 필터에서 수행 한 다른 작업은 IE를 인코딩하는 기본 응답을 설정하는 것입니다. 반환 된 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 페이지에 다음과 같은 WebApp이 있어야합니다.

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

다른 JSP- 프레이즈를 가진 어떤 종류의 레이아웃이 사용되면 모두 그들의.

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&amp;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도 구성해야합니다. 일반적으로 이것은 수정하여 Windows에서 수행됩니다 my.ini -구성하여 파일 및 리눅스에서 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 ;

요청 받기 : Latin1 및 UTF-8

Tomcat의 Server.xml에 정의 된 경우 요청 매개 변수를 UTF-8로 인코딩하면 다음 GET 요청이 올바르게 처리됩니다.

   https://localhost:8443/ID/Users?action=search&name=Petteri
   https://localhost:8443/ID/Users?action=search&name=ж

Ascii-characters는 Latin1 및 UTF-8과 동일한 방식으로 인코딩되므로 문자열 "Petteri"는 올바르게 처리됩니다.

키릴 특성 ill는 Latin1에서 전혀 이해되지 않습니다. Tomcat은 요청 매개 변수를 UTF-8으로 처리하도록 지시되므로 해당 문자를 올바르게 인코딩합니다. %d0%b6.

브라우저가 UTF-8 인코딩 (요청 헤더 및 HTML 메타 태그 포함)의 페이지를 읽도록 지시받는 경우, 최소한 Firefox 2/3 및이 기간의 다른 브라우저는 모두 문자 자체를 다음과 같이 인코딩합니다. %d0%b6.

최종 결과는 "Petteri"라는 이름을 가진 모든 사용자와 "ж"이라는 이름을 가진 모든 사용자가 발견된다는 것입니다.

그러나 äåö는 어떻습니까?

http-specification은 기본적으로 URL이 latin1로 인코딩된다고 정의합니다. 이로 인해 Firefox2, Firefox3 등이 발생합니다.

    https://localhost:8443/ID/Users?action=search&name=*Päivi*

인코딩 된 버전에

    https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*

라틴어에서 캐릭터 ä 로코딩됩니다 %e4. 페이지/요청/모든 것이 UTF-8을 사용하도록 정의되어 있지만. UTF-8 인코딩 된 버전의 ä %C3%A4

그 결과 WebApp이 일부 문자가 Latin1 및 UTF-8의 다른 문자로 인코딩되므로 WebApp이 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/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/

중요 사항

지원합니다 기본 다국어 평면 3 바이트 UTF-8 문자 사용. 그 밖으로 나가야한다면 (특정 알파벳은 3 바이트 이상의 UTF-8이 필요). VARBINARY 열 유형 또는 사용 utf8mb4 캐릭터 세트 (MySQL 5.5.3 이상이 필요합니다). 사용하는 것이 좋습니다 utf8 MySQL에서 캐릭터 세트는 시간의 100% 작동하지 않습니다.

Apache와 Tomcat

APACHE + TOMCAT + MOD_JK 커넥터를 사용하는 경우 다음과 같은 변경 사항도 수행해야합니다.

  1. 8009 커넥터의 경우 uriencoding = "utf-8"을 tomcat server.xml 파일에 추가하면 mod_jk 커넥터에서 사용됩니다. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
  2. Apache 폴더를 얻었습니다 /etc/httpd/conf 그리고 추가 AddDefaultCharset utf-8 안에 httpd.conf file. 메모: 먼저 그것이 존재하는지 확인하십시오. 존재하는 경우이 줄로 업데이트 할 수 있습니다. 이 라인을 맨 아래에 추가 할 수도 있습니다.

다른 팁

나는 당신이 당신의 대답에서 그것을 아주 잘 요약했다고 생각합니다.

끝에서 끝까지 UTF-8-ing (?)의 과정에서 Java 자체가 UTF-8을 사용하고 있는지 확인할 수도 있습니다. JVM의 매개 변수로 -dfile.encoding = utf -8을 사용하십시오 (Catalina.bat에서 구성 할 수 있음).

추가합니다 코 소트의 대답, 스프링을 사용하는 경우 자신의 서블릿 필터를 쓰지 않고 클래스를 사용할 수 있습니다. 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 Connection Pool (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 Connection Pool에 넣고 싶지 않다면 다음 줄과 마찬가지로 JDBC-URL로 구성 할 수 있습니다.

jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek

나와 Nick에게, 그래서 우리는 그것을 잊지 않고 더 이상 시간을 낭비합니다 .....

좋은 자세한 답변. 다른 사람들이 UTF-8 인코딩이 작동 중 URL에 인코딩하는 것을 보는 데 도움이되는 하나를 추가하고 싶었습니다.

Firefox의 URL에서 UTF-8 인코딩을 활성화하려면 아래 단계를 따라하십시오.

  1. 주소 표시 줄에 "정보 : 구성"을 입력하십시오.

  2. 필터 입력 유형을 사용하여 "Network.standard-url.encode-Query-utf8"속성을 검색하십시오.

  3. 위의 속성은 기본적으로 거짓이되며 True로 바꿉니다.
  4. 브라우저를 다시 시작하십시오.

URL의 UTF-8 인코딩은 IE6/7/8 및 Chrome에서 기본적으로 작동합니다.

나는 비슷한 문제가 있지만 파일의 파일 이름에서 Apache Commons로 압축하고 있습니다. 그래서 나는이 명령으로 그것을 해결했다.

convmv --notest -f cp1252 -t utf8 * -r

그것은 나에게 아주 잘 작동합니다. 누구든지 도와주기를 바랍니다;)

Message Bundles에서 유니 코드 문자를 표시하는 경우 JSP 페이지에 유니 코드를 표시하기 위해 "JSP 페이지 인코딩"섹션을 적용 할 필요가 없습니다. "charsetfilter"섹션 만 있으면됩니다.

언급되지 않은 또 다른 요점은 Ajax와 함께 일하는 Java 서블릿과 관련이 있습니다. 웹 페이지가 웹 페이지가 사용자로부터 utf-8 텍스트를 선택하는 상황이 있습니다. Servlet은 데이터베이스를 쿼리하고 결과를 캡처하고 XML로 XML로 반환하여 JavaScript 파일을 형식화하고 원래 웹 페이지에 형식화 된 응답을 삽입합니다.

하나의 웹 앱에서 나는 URI를 구성 할 때 JavaScript를 마무리하기위한 초기 Ajax Book의 지침을 따르고있었습니다. 이 책의 예는 Escape () 메소드를 사용했는데, 내가 발견 한 (The Hard Way)는 잘못되었습니다. UTF-8의 경우 encodeUricomponent ()를 사용해야합니다.

요즘 자신의 Ajax를 굴리는 사람은 거의 없지만, 나는 이것을 추가 할 것이라고 생각했습니다.

에 대한 CharsetFilter @kosoant 답변에 언급되었습니다 ....

빌드가 있습니다 Filter Tomcat에서 web.xml (에 위치한 conf/web.xml). 필터가 명명되었습니다 setCharacterEncodingFilter 기본적으로 댓글을 달았습니다. 당신은 이것을 무너 뜨릴 수 있습니다 (그 탑승을 기억하십시오 filter-mapping 도 )

또한 설정할 필요가 없습니다 jsp-config 당신의 web.xml (Tomcat 7+에 대해 테스트했습니다)

언젠가 MySQL 관리자 마법사를 통해 문제를 해결할 수 있습니다. ~ 안에

시작 변수> 고급>

그리고 DEF를 설정합니다. 숯 세트 : UTF8

이 구성은 MySQL을 다시 시작해야 할 수도 있습니다.

이전 응답은 내 문제와 함께 작동하지 않았습니다. Tomcat 및 Apache Mod_proxy_AJP와 함께 생산에만 있었다. 우체수가 아닌 ASCII 숯을 잃어 버렸습니까? 결국 문제는 JVM DefaultCharset (기본 유도에서 US-ASCII : charset dfset = charset.defaultcharset ();)에 문제가 있었다. 따라서 솔루션은 utf-8을 기본 charset으로 실행하기 위해 수정 자로 Tomcat 서버를 실행하는 것이었다.

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" 

(이 라인을 Catalina.sh 및 Service Tomcat 재시작에 추가하십시오)

어쩌면 Linux 시스템 변수를 변경해야 할 수도 있습니다 (편집 ~/.bashrc 및 ~/.profile은 영구적 인 변경을 위해 참조하십시오. https://perlgeek.de/en/article/set-up--clean-utf8-environment)

내보내기 lc_all = en_us.utf-8
내보내기 lang = en_us.utf-8

내보내기 언어 = en_us.utf-8

Spring MVC 5 + Tomcat 9 + JSP에서 동일한 문제에 직면했습니다.
긴 연구 후 우아한 솔루션을 얻었습니다 (아니요 필요 필터 그리고 아니요 필요 변화 Tomcat에서 Server.xml (8.0.0-rc3 버전부터 시작)))

  1. 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 */
    
    }
    
  2. dispatcherservletinitializer 구현 @override 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 */
    
    }
    
  3. 모든 메시지 소스를 저장하고 UTF-8 인코딩에서 파일을 봅니다.

  4. < %@ page contenttype = "text/html; charset = utf-8" %> 또는 < %@ pageencoding = "utf-8" %> 각 *.jsp 파일 또는 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>
    

Connection Pool (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");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top