URL-кодированный символ неправильно обрабатывается webflow / EL / JSF - PullRequest
5 голосов
/ 07 апреля 2011

когда я отправляю символ Ö со страницы, бэкэнд получает Ã. Веб-страница является частью приложения Spring Webflow / JSF1.2 / Facelets. Когда я проверяю POST с помощью firebug, я вижу:

Content-Type: application/x-www-form-urlencoded 
Content-Length: 74 
rapport=krediet_aanvragen&fw1=0&fw2=%C3%96ZTEKIN&fw3=0&fw4=0&zoeken=Zoeken

Символ Ö кодируется как% C3% 96, используя эту таблицу . Я вижу, что это правильное шестнадцатеричное представление символа UTF-8 / Unicode Ö. Однако, когда он достигает бэкэнда, персонаж меняется на Ã. Используя ту же таблицу, я вижу, что где-то есть код, который пытается интерпретировать C3 и 96 по отдельности (или в формате unicode \ u). U + 00C3 оказывается М, 96 не видимый символ, что объясняет это.

Теперь я знаю, что это типичный случай несоответствия кодировки, я просто не знаю, где искать, чтобы это исправить.

Веб-страница содержит

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

При отладке я вижу библиотеку, ответственную за неправильную интерпретацию, - jboss-el 2.0.0.GA, которая кажется правильной, потому что значение разбирается в серверной части в выражении веб-потока:

<evaluate expression="rapportCriteria.addParameter('fw2', flowScope.fw2)" />

Он помещается в flowScope с помощью:

<evaluate expression="requestParameters.fw2" result="flowScope.fw2"/>

Не обращайте внимания на извилистый способ получения ввода формы в бэкэнд, это код, который пытается интегрировать Webflow с отчетами BIRT ... но у меня такой же симптом в других веб-приложениях.

Есть идеи, с чего мне начать искать?

1 Ответ

6 голосов
/ 07 апреля 2011

Я вижу, что это правильное шестнадцатеричное представление символа UTF-8 / Unicode Ö. Однако, когда он достигает бэкэнда, персонаж меняется на Ã.

Таким образом, кодировка символов на стороне клиента для кодирования тела POST является правильной, а кодировка символов на стороне сервера для декодирования тела POST - нет. Вам нужно создать Filter, который в основном делает следующее в doFilter() метод

request.setCharacterEncoding("UTF-8");

и сопоставьте его с интересующим вас шаблоном URL Spring также уже предлагает один из них, CharacterEncodingFilter, который делает в основном все вышеизложенное. Все, что вам нужно сделать, это добавить его в web.xml:

<filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Смотри также:


Кстати, мета-заголовок HTML не имеет отношения к проблеме, он игнорируется, когда страница обслуживается по HTTP. Это заголовок ответа HTTP, который указывает браузеру, в какой кодировке он должен отображать ответы и для отправки параметров обратно на сервер. Это, очевидно, уже установлено правильно, так как тело POST правильно закодировано. Мета-заголовок HTML используется только тогда, когда пользователь сохраняет страницу на локальном диске и просматривает ее позже с локального диска.

...