Nice programing

Spring MVC UTF-8 인코딩

nicepro 2020. 12. 2. 21:57
반응형

Spring MVC UTF-8 인코딩


현재 저는 Spring MVC를 시작하려고합니다. 시도하는 동안 인코딩 문제가 발생했습니다.

내 JSP 페이지에 UTF-8 문자를 표시하고 싶습니다. 그래서 내 ModelAndView에 UTF-8 문자가있는 문자열을 추가했습니다. 다음과 같이 보입니다.

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value="/", method=RequestMethod.GET)
    public ModelAndView home() {
        logger.info("Welcome home!");
        return new ModelAndView("home", "utftest", "ölm");
    }

}

JSP 페이지에서 다음과 같이 UTF-8 문자로 문자열을 표시하고 싶습니다.

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Home</title>
</head>
<body>
    <h1>Hello world!</h1>
    <p><c:out value="ö" /></p>
    <p><c:out value="${utftest}"></c:out></p>
</body>
</html>

결과적으로 다음을 얻습니다.

Hello world!

ö

ölm

다음 코드 <c:out value="ö" />는 인코딩 오류없이 표시되었습니다. 또한 Springsource Tool Suite에서 기본 인코딩을 UTF-8로 설정했지만 여전히 잘못된 문자가 표시됩니다.

편집하다:

OS X 10.6이 설치된 Mac을 사용하고 있다고 말 했어야했을 것입니다. Spring 개발의 경우 Spring (http://www.springsource.com/developer/sts)의 Springsource Tool Suite를 사용합니다. 이것이 내 설정에 무엇이 잘못되었는지 알아내는 데 도움이되기를 바랍니다.

편집 2 :

McDwell 덕분에 컨트롤러 "\u00f6lm"대신 사용을 시도 "ölm"했으며 JSP 페이지의 인코딩 문제가 사라졌습니다.

내 .java 파일이 잘못된 문자 집합으로 인코딩되었음을 의미합니까? Eclipse에서 이것을 어디에서 변경할 수 있습니까?

감사합니다.


확실히 당신은 봄의 등록 확인 CharacterEncodingFilter당신에 web.xml(즉, 파일의 첫 번째 필터해야합니다).

<filter>  
    <filter-name>encodingFilter</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>true</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>encodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 

톰캣에있는 경우에 당신은을 설정하지 않았 URIEncoding당신에 server.xml. UTF-8로 설정하지 않으면 작동하지 않습니다. 확실히 CharacterEncodingFilter. 그럼에도 불구하고 따라야 할 간결한 체크리스트 가 있습니다. 이 작업을 수행하도록 확실히 안내 할 것입니다.


좋아, 인코딩 문제의 이유를 찾았습니다.

내 빌드 프로세스에 결함이 있습니다. pom.xml파일 에서 Maven에게 UTF-8 인코딩으로 프로젝트를 빌드하도록 지시 하지 않았습니다 . 따라서 Maven은 MacRoman 인 내 시스템에서 기본 인코딩을 가져와 MacRoman 인코딩으로 빌드했습니다.

다행히 Maven은 프로젝트를 빌드 할 때 이에 대해 경고합니다 (그러나 다른 모든 메시지로 인해 경고가 화면에서 빠르게 사라질 가능성이 높습니다).

pom.xml파일 에서 설정해야하는 속성은 다음과 같습니다 .

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

모든 도움에 감사드립니다. 너희들없이 나는 이것을 알아낼 수 없을 것이다!


Benjamin의 답변 (필자가 훑어 본 것임) 외에도 파일이 실제로 적절한 인코딩 (소스 코드, JSP 등의 경우 UTF-8)을 사용하여 저장되었는지 확인해야합니다.하지만 Java 속성 파일 정의에 따라 ISO 8859-1로 인코딩되어야 함).

이것의 문제는 파일을 저장하는 데 어떤 인코딩이 사용되었는지 알 수 없다는 것입니다. 유일한 옵션은 특정 인코딩을 사용하여 파일을 열고 내용이 적절한 지 확인하는 것입니다. iconv를 사용하여 가정 된 인코딩에서 원하는 인코딩으로 파일을 변환 할 수도 있습니다. 오류가 발생하면 가정이 잘못된 것입니다. 따라서 hello.jsp가 UTF-8로 인코딩되었다고 가정하면 "iconv -f UTF-16 -t UTF-8 hello.jsp"를 실행하고 오류를 확인합니다.

파일이 제대로 인코딩되지 않았 음을 확인해야하는 경우 그 이유를 찾아야합니다. 파일을 만드는 데 사용한 편집기 또는 IDE 일 수 있습니다. Eclipse (및 STS)의 경우 텍스트 파일 인코딩 (기본 설정 / 일반 / 작업 공간)이 UTF-8로 설정되어 있는지 확인하십시오 (불행히도 시스템의 플랫폼 인코딩이 기본값입니다).

인코딩 문제를 디버깅하기가 너무 어렵게 만드는 이유는 관련된 구성 요소가 너무 많기 때문입니다 (텍스트 편집기, borwser 및 그 사이에있는 각각의 모든 소프트웨어 구성 요소, 경우에 따라 데이터베이스 포함). 각각에 오류가 발생할 가능성이 있습니다.


Benjamin의 답변 외에도 Spring Security 를 사용하는 경우 Web.xml에 CharacterEncodingFilter를 배치하면 항상 작동하지 않을 수 있습니다. 이 경우 사용자 지정 필터를 만들고 필터 체인에 첫 번째 필터로 추가해야합니다. 체인의 첫 번째 필터인지 확인하려면 addFilterBeforeWebSecurityConfigurerAdapter에서 사용하여 ChannelProcessingFilter 앞에 추가해야합니다 .

@Configuration
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //add your custom encoding filter as the first filter in the chain
        http.addFilterBefore(new EncodingFilter(), ChannelProcessingFilter.class);

        http.authorizeRequests()
            .and()
            // your code here ...
    }
}

Spring Security의 모든 필터 순서는 여기에서 확인할 수 있습니다. HttpSecurityBuilder-addFilter ()

사용자 정의 UTF-8 인코딩 필터는 다음과 같습니다.

public class EncodingFilter extends GenericFilterBean {

    @Override
    public void doFilter(
            ServletRequest request, 
            ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        chain.doFilter(request, response);
    }
}

jsp 파일을 추가하는 것을 잊지 마십시오.

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

거기에 있다면 web.xml에서 CharacterEncodingFilter를 제거하십시오.


Spring MVC에서 문자열을 반환하는 UTF-8 인코딩을 강제하는 가장 쉬운 솔루션 :

에서는 다음 @RequestMapping을 사용합니다.

produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8"

right-click to your controller.java then properties and check if your text file is encoded with utf-8, if not this is your mistake.


To solve this issue you need below three steps:

  1. Set page encoding to UTF-8 like below:

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page contentType="text/html;charset=UTF-8" %>
    
  2. Set filter in web.xml file as below:

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  3. Set resource encoding to UTF-8, in case if you are writing any UTF-8 characters in Java code or JSP directly.


Depending on how you render your view, you may also need:

@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
    return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}

Worked for me like here Spring MVC Java config

by added to web initializer

 @Override
      protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter};
      }

참고URL : https://stackoverflow.com/questions/5928046/spring-mvc-utf-8-encoding

반응형