복붙노트

[SPRING] 폼 포스트와 스프링 컨트롤러를 사용한 UTF-8 인코딩

SPRING

폼 포스트와 스프링 컨트롤러를 사용한 UTF-8 인코딩

내부에 UTF8 문자가있는 양식을 제출하려고합니다. 양식은 다음과 같습니다.

<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">>
  <input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state">
</form>

내 서버는 스프링 기반입니다. 내 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>

문제는 UTF-8 문자가 엉망이되고 있다는 것입니다. 저는 컨트롤러 시작 부분에 중단 점을 넣었습니다. 캐릭터는 그 시점에서 엉망이되었습니다. 또한 Controller 내에서 UTF8 문자를 생성하면 브라우저에서 올바르게 렌더링됩니다. 폼 포스트에서 컨트롤러는 문자를 제대로 수신하지 못합니다.

내가 뭘 잘못했는지 알기나 해?

편집 : 새 페이지 데이터에서 엉망이 아니라 이중으로 인코딩 된 것처럼 보입니다. 나는 그것이 왜 이중으로 인코딩되었는지 이해할 수 없다.

편집 2 : 게시물 대신 가져 오기 위해 양식을 변경하면 모든 것이 완벽하게 작동합니다. 나는 어떤 게시물이 깨지는 지 전혀 모른다.

해결법

  1. ==============================

    1.브라우저가 요청 헤더의 Content-Type의 일부로 문자 세트를 보내지 않는 것처럼 보입니다 (양식의 accept-charset이 설정되어 있어도) Tomcat은 Latin-1과 같은 요청의 본문을 처리합니다 (http : //wiki.apache. org / tomcat / FAQ / CharacterEncoding # Q1).

    브라우저가 요청 헤더의 Content-Type의 일부로 문자 세트를 보내지 않는 것처럼 보입니다 (양식의 accept-charset이 설정되어 있어도) Tomcat은 Latin-1과 같은 요청의 본문을 처리합니다 (http : //wiki.apache. org / tomcat / FAQ / CharacterEncoding # Q1).

    그래서 나중에 Latin-1로 디코딩되어 UTF-8로 인코딩되어 깨진 문자가 생길 수 있습니다.

    CharacterEncodingFilter를 맨 위로 이동하고 인코딩을 UTF-8로 설정하여 강제로 문제를 해결했습니다.

  2. ==============================

    2.EncodingFilter에 대한 web.xml에 필터 매핑 항목이 있습니까?

    EncodingFilter에 대한 web.xml에 필터 매핑 항목이 있습니까?

    <filter-mapping>
      <filter-name>EncodingFilter</filter-name>
      <url-pattern>*</url-pattern>
    </filter-mapping>
    
  3. ==============================

    3.CharacterEncodingFilter 자체를 제거하여 두 번 인코딩하는 것이 좋습니다.

    CharacterEncodingFilter 자체를 제거하여 두 번 인코딩하는 것이 좋습니다.

    상황을 디버깅하려면 먼저 브라우저가 데이터를 올바르게 게시하고 있는지 확인해야합니다. Firebug (Firefox의 경우) 또는 Chrome (F12)의 개발자 도구

    대부분이 문제는 서버 측에 있습니다. 어떤 서버를 사용합니까? Tomcat을 사용하는 경우 server.xml의 Connector 요소에서 Charset Encoding을 UTF-8로 설정해야합니다

    업데이트 1 :

    문제가 당신이 설정하고있는 forceEncoding 일 가능성이 매우 높습니다. 문서 당

    get을 수행하면 인코딩이 지정되지 않으므로 인코딩이 작동한다는 의미입니다.

    그러나 POST를 수행하면 인코딩이 이미 적용된 상태이며 forceEncoding = true로 인해 인코딩이 다시 적용됩니다.

  4. from https://stackoverflow.com/questions/16029269/utf-8-encoding-with-form-post-and-spring-controller by cc-by-sa and MIT license