Как да предам Unicode символи като JSP/Servlet request.getParameter?

След много проби и грешки все още не мога да разбера проблема. JSP, сървлетът и базата данни са настроени да приемат UTF-8 кодиране, но дори когато използвам request.getParameter за нещо, което има двубайтови знаци като тире em, те се разбъркват като счупени знаци.

Направих ръчни подавания към базата данни и тя може да приеме тези знаци, няма проблем. И ако изтегля текста от базата данни в сървлет и го отпечатам във формата на моята jsp страница, той не показва проблем.

Единственият път, когато открих, че се връща като счупени знаци, е когато се опитам да го покажа на друго място, след като го извлека с помощта на request.getParameter.

Някой друг имал ли е този проблем? Как мога да го поправя?


person Community    schedule 09.05.2012    source източник
comment
Клиентът също така изпраща ли UTF-8 кодирани неща до сървъра?   -  person Romain    schedule 09.05.2012
comment
Вярвам, че е, но как мога да съм сигурен?   -  person    schedule 09.05.2012


Отговори (4)


Това може да се случи, ако кодирането на заявка и/или отговор изобщо не е правилно зададено.

За GET заявки трябва да го конфигурирате на ниво servletcontainer. Не е ясно кой от тях използвате, но за пример Tomcat това трябва да се направи от атрибута URIEncoding в <Connector> елемент в неговия /conf/server.xml.

<Connector ... URIEncoding="UTF-8">

За POST заявки трябва да създадете филтър, който е нанесен върху желания URL модел, покриващ всички тези POST заявки. напр. *.jsp или дори /*. Направете следната работа в doFilter():

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

За HTML отговори и кодиране от страна на клиента на изпратени входни стойности на HTML формуляр трябва да зададете кодирането на JSP страницата. Добавете това в горната част на JSP (вероятно вече сте го направили правилно предвид факта, че показването на UTF-8 права форма DB работи добре).

<%@page pageEncoding="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>

За файлове с изходен код и stdout (IDE конзола) трябва да зададете кодирането на работното пространство на IDE. Не е ясно кой от тях използвате, но например за Eclipse това трябва да стане, като зададете Window › Preferences › General › Workspace › Text File Encoding на UTF-8.

въведете описание на изображението тук

Обърнете внимание, че HTML <meta http-equiv> таговете се игнорират, когато страницата се обслужва през HTTP. Взема се предвид само когато страницата е отворена от файловата система на локалния диск чрез file://. Освен това указването на <form accept-charset> е ненужно, тъй като вече е по подразбиране кодирането на отговора, използвано по време на обслужване на HTML страницата с формуляра. Вижте също W3 HTML спецификация.

Вижте също:

person BalusC    schedule 09.05.2012

Отговорът на BalusC е правилен, но просто искам да добавя, че е важно (разбира се, за метода POST).

request.setCharacterEncoding("UTF-8");

се извиква, преди да прочетете който и да е параметър. Ето как се реализира параметърът за четене:

@Override
public String getParameter(String name) {
    if (!parametersParsed) {
        parseParameters();
    }
    return coyoteRequest.getParameters().getParameter(name);
}

Както можете да видите, има флаг parametersParsed, който се задава, когато четете който и да е параметър за първи път, метод parseParameters() с анализиране на всички параметри на заявката и задаване на кодирането. Обаждане:

request.setCharacterEncoding("UTF-8");

след анализ на параметрите няма да има ефект! Ето защо някои хора се оплакват, че настройката на кодирането на заявката не работи. Повечето отговори тук предлагат да се използва сервлет филтър и да се зададе кодирането на знаци там. Това е правилно, но също така имайте предвид, че някои библиотеки за сигурност могат да четат параметри на заявката преди вашия филтър (това беше моят случай), така че ако вашият филтър се изпълни след това, кодирането на знаци на параметрите на заявката вече е зададено и настройката UTF-8 или друга ще нямат ефект.

person Tomasz Hadam    schedule 29.08.2016

Често задаваните въпроси за Tomcat покриват тази тема доста добре. По-специално: http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8 и http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4

Тестовият JSP, даден в често задаваните въпроси, е по същество този, който използвах, когато минавах през Tomcat преди години за отстраняване на различни проблеми с кодирането.

person Mark Thomas    schedule 09.05.2012

Само искам да добавя нещо, в случай че някой друг е направил същата грешка като мен, където съм пропуснал метод POST

Прочетох всички тези решения и ги приложих към моя код, но все още не работи, защото забравих да добавя method="POST" в моя <form> таг

person sicnarfmis    schedule 21.07.2017