문제

PrimeFaces v2.2.1을 계속 사용하던 시절에는 다음과 같은 PrimeFaces 입력 컴포넌트를 사용하여 중국어 등의 유니코드 입력을 입력할 수 있었습니다. <p:inputText> 그리고 <p:editor>, 관리되는 Bean 메소드에서 올바른 모양의 입력을 검색합니다.

그런데 PrimeFaces v3.1.1로 업그레이드한 후에는 해당 문자가 모두 Mojibake 또는 물음표가 됩니다.라틴어 입력만 제대로 작동하며 중국어, 아랍어, 히브리어, 키릴 문자 등의 문자는 형식이 잘못되었습니다.

이 문제는 어떻게 발생하며 어떻게 해결할 수 있나요?

도움이 되었습니까?

해결책

소개

일반적으로,JSF/Facelets 설정 요청 매개 변수는 문자 인코딩에 UTF-8 을 기본적으로 이미 경고가 만들어/복원됩니다.하지만 어떤 경우에 요청 매개 변수는 요청 뷰 만들어/복원,그것을 너무 늦게 적절한 설정 문자 인코딩이 있습니다.요청 매개 변수 즉,구문 분석할 수 있습니다.

PrimeFaces 인코딩 실패

는 그것에 실패 PrimeFaces3.x 서 업그레이드 후 2.x 에 의해 발생 new isAjaxRequest() override 에 PrimeFaces' PrimePartialViewContext 는 검사 요청 매개변수:

@Override
public boolean isAjaxRequest() {
    return getWrapped().isAjaxRequest()
            || FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().containsKey("javax.faces.partial.ajax");
}

기본적으로, isAjaxRequest() (하나의 Mojarra/MyFaces,로 위 PrimeFaces 코드에 의해 얻어 getWrapped())검사를 요청 헤더 다음과 같이 어떤 영향을 미치지 않는 요청 매개 변수를 인코딩로 요청 매개 변수는지 분석할 때 요청 헤더를 얻은 것입니다:

    if (ajaxRequest == null) {
        ajaxRequest = "partial/ajax".equals(ctx.
            getExternalContext().getRequestHeaderMap().get("Faces-Request"));
    }

그러나, isAjaxRequest() 에 의해 호출 될 수 있습니다 모든 단계자가 청자를 높이거나 시스템 이벤트를 수신 또는 응용 프로그램 공장 뷰 만들어/복원됩니다.그래서 사용하는 경우 PrimeFaces3.x,그 요청 매개 변수는 구문 분석 적절한 문자 인코딩 설정되어 있고,따라서 사용하여 서버의 기본 인코딩을 하는 일반적으로 ISO-8859-1.이것이 모든 것입니다.

Solutions

하는 방법은 여러 가지가 있 fix it:

  1. 블릿 필터ServletRequest#setCharacterEncoding() UTF-8 입니다.설정의 응답을 인코딩하여 ServletResponse#setCharacterEncoding() 은 방법에 의해 불필요한 그것에 의해 영향을 받지 않습니다.

    @WebFilter("/*")
    public class CharacterEncodingFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }
    
        // ...
    }
    

    당신은 계정 HttpServletRequest#setCharacterEncoding() 만 설정 인코딩은 POST 요청의 매개 변수를 GET 요청 매개 변수입니다.를 GET 요청 매개 변수는 당신이 여전히 해야 그것을 구성하는 서버에서 수준이다.

    만약 당신이 사용하는 일이 JSF 유틸리티의 라이브러리 OmniFaces, 같은 필터는 이미 제공 밖으로 상자 CharacterEncodingFilter.그냥 설치하에서 아래와 같이 web.xml 으로 첫 번째 필터 항목은:

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.omnifaces.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

  2. 서버를 다시 구성하는 대신 UTF-8 을 사용의 ISO-8859-1 일 기본값으로 인코딩이 있습니다.의 경우에는 Glassfish,는 것의 문제는 다음 항목을 추가하 <glassfish-web-app>/WEB-INF/glassfish-web.xml 파일:

    <parameter-encoding default-charset="UTF-8" />
    

    Tomcat 지원하지 않는 것입니다.그것은 URIEncoding 특성 <Context> 엔지만,이를 이용하여 얻을 요청만을 게재하지 않을 요청합니다.


  3. 보고는 그것이 버그를 PrimeFaces.가 어떤 정당한 이유를 확인하는 HTTP 요청 ajax 를 확인하여 요청을 요청 매개 변수는 대신에 요청의 헤더로 같이 할 것에 대한 표준 JSF 및 예를 들어 jQuery?이 PrimeFaces' core.js JavaScript 하는 것입니다.더 나은 것을 경우 그것은 설정으로 그것을 요청 헤더의 XMLHttpRequest.


는 솔루션을 작동하지 않는

아마 당신은 우연히 발견은 아래"솔루션"어딘가에 인터넷에서 조사하면서 이 문제를 해결합니다.이러한 솔루션을 할 수 없지에서 작동이 특정한 경우.설명은 다음과 같습니다.

  • 설정 XML 프롤로그:

    <?xml version='1.0' encoding='UTF-8' ?>
    

    이라고 해도 과언이 아닐 XML 파서 사용하 UTF-8 디코딩하는 XML 소스기 전에 건물 XML 트리습니다.XML 파서 실제로 사용되는 Facelts 은 색소폰 JSF view 구축 시간.이 부분은 완전히 함께 할 수 없는 HTTP 요청/응답 인코딩이 있습니다.

  • 설정 HTML 메타 태그:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    

    HTML 메타 태그는 무시할 때 페이지로 제공되는 HTTP 를 통해 http(s):// URI.그것은 단지 사용되었을 때 페이지에는 클라이언트로 저장에 HTML 파일이 로컬 디스크 시스템 다음 다시 열에 의해 file:// URI 에서 브라우저입니다.

  • 설정 HTML 양식을 받아들이 charset 속성:

    <h:form accept-charset="UTF-8">
    

    현대적인 브라우저 무시한다.이는 효과에서는 Microsoft Internet Explorer 브라우저입니다.그럼에도 그것은 그 일을 잘못.그것을 사용하지 않습니다.모든 부 webbrowsers 대신 사용하여 문자에 지정된 특성 Content-Type 헤더의 반응이다.도 MSIE 할 것입니다 올바른 방법으로 그것만큼 당신이 지정하지 않은 accept-charset 특성이 있습니다.

  • 설정 JVM 인수:

    -Dfile.encoding=UTF-8
    

    이것은 단지 사용하여 Oracle(!) JVM 을 읽고 분석 Java 소스 파일이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top