programing

Java 웹 앱에서 UTF-8을 작동시키는 방법

bestcode 2022. 7. 10. 21:21
반응형

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&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도 구성해야 합니다.일반적으로 이 작업은 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/

중요사항

은 3바이트 UTF-8 문자를 사용하는 기본 다국어 플레인을 지원합니다.이 범위를 벗어나야 할 경우(특정 알파벳은 3바이트 이상의 UTF-8을 필요로 합니다), 다음 중 하나의 플레이버를 사용해야 합니다.VARBINARY열을 입력하거나 문자 집합을 사용합니다(MySQL 5.5.3 이상 필요).주의해 주세요.utf8MySQL은 100%로 되어 있습니다.

Tomcat with Apache

Apache + Tomcat + mod_를 사용하는 경우JK 커넥터도 다음과 같이 변경해야 합니다.

  1. 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"/>
  2. 아파치 폴더도 가져가고 /etc/httpd/confAddDefaultCharset utf-8httpd.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 인코딩을 유효하게 하려면 , 다음의 순서에 따릅니다.

  1. 주소 표시줄에 "about:config"를 입력합니다.

  2. 필터 입력 유형을 사용하여 "network.standard-url.encode-query-utf8" 속성을 검색합니다.

  3. 위의 속성은 기본적으로 false이므로 TRUE로 설정합니다.
  4. 브라우저를 재시작합니다.

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

language=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 ...에 기재되어 있습니다.

에 빌드가 있다FilterTomcat에서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에서는 필터도 필요 없고 변경도 필요 없습니다).

  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. 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 */
    
    }
    
  3. 모든 메시지 원본 및 보기 파일을 UTF-8 인코딩으로 저장합니다.

  4. <%@ 페이지 내용 추가유형="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

반응형