it-swarm.com.de

UTF-8-Codierungsproblem in Spring MVC

Ich habe eine Spring MVC-Bohne und möchte mit der Kodierung UTF-8 den türkischen Charakter zurückgeben. Obwohl meine Zeichenfolge "şŞğĞİıçÇöÖüÜ" ist, wird sie als "?????? çÇöÖüÜ" zurückgegeben. Und auch wenn ich mir die Antwortseite, die Internet Explorer-Seite, ansehe, handelt es sich bei der Kodierung um westeuropäisches ISO, nicht um UTF-8.

Hier ist der Code:

    @RequestMapping(method=RequestMethod.GET,value="/GetMyList")
public @ResponseBody String getMyList(HttpServletRequest request, HttpServletResponse response) throws CryptoException{
    String contentType= "text/html;charset=UTF-8";
    response.setContentType(contentType);
    try {
        request.setCharacterEncoding("utf-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    response.setCharacterEncoding("utf-8");     
    String str="şŞğĞİıçÇöÖüÜ";
    return str;
}   
42
ysnky

Ich habe es herausgefunden, Sie können dem Mapping-Abfragen Productions hinzufügen = "Text/Plain;

@RequestMapping(value = "/rest/create/document", produces = "text/plain;charset=UTF-8")
@ResponseBody
public void create(Document document, HttpServletRespone respone) throws UnsupportedEncodingException {

    Document newDocument = DocumentService.create(Document);

    return jsonSerializer.serialize(newDocument);
}

Weitere Informationen zur Lösung finden Sie in diesem Blogeintrag.

58
Charlie Wu

in der XML-Datei des Dispatcher-Servlets müssen Sie eine Eigenschaft "<property name="contentType" value="text/html;charset=UTF-8" />" in Ihrer ViewResolver-Bean .

es sieht ungefähr so ​​aus:

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
       ...
       <property name="contentType" value="text/html;charset=UTF-8" />
       ...
</bean>
22
aki

Konvertieren Sie den JSON-String selbst in UTF-8.

@RequestMapping(value = "/example.json", method = RequestMethod.GET)
@ResponseBody
public byte[] example() throws Exception {

    return "{ 'text': 'äöüß' } ".getBytes("UTF-8");
}
6
rwitzel

Fügen Sie auch zu Ihren Bohnen hinzu:

   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <array>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/x-www-form-urlencoded;charset=UTF-8</value>
                    </list>
                </property>
        </bean></bean>

Für @ExceptionHandler:

enter code<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
    <property name="messageConverters">
        <array>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/x-www-form-urlencoded;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/x-www-form-urlencoded;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </array>
    </property>
</bean>

Wenn Sie <mvc:annotation-driven/> verwenden, sollte es nach Beans sein.

2
Yura_dan

Es gibt einige ähnliche Fragen: Spring MVC Antwortcodierungsproblem , Benutzerdefinierter HttpMessageConverter mit @ResponseBody, um Json-Dinge zu erledigen .

Meine einfache Lösung ist jedoch:

@RequestMapping(method=RequestMethod.GET,value="/GetMyList")
public ModelAndView getMyList(){
  String test = "čćžđš";
  ...
  ModelAndView mav = new ModelAndView("html_utf8");
  mav.addObject("responseBody", test);
}

und die Ansicht html_utf8.jsp

<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>${responseBody}

Keine zusätzlichen Klassen und Konfigurationen.
Sie können auch eine andere Ansicht (z. B. json_utf8) für einen anderen Inhaltstyp erstellen.

2
Trung

Wenn Sie versuchen, Sonderzeichen wie è, à, ù usw. zu senden, werden auf Ihrer Jsp-Post-Seite möglicherweise viele Zeichen wie '£', 'Ä' oder 'Æ' ...__ angezeigt. Um dieses Problem in 99 zu lösen % der Fälle, in denen Sie diesen Code in der Datei web.xml am Anfang der Datei verschieben können:

   <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>

Ein vollständiges Beispiel finden Sie hier: https://lentux-informatica.com/spring-mvc-utf-8-encoding-problem-solved/

1

Ich habe dieses Problem behoben, indem ich den produzierten Rückgabetyp auf die erste GET-RequestMethod herleitete. Der wichtige Teil hier ist der 

produces="application/json;charset=UTF-8

So wird jeder wie use/account/**, Spring// Anwendungssoftware zurückgegeben; charset = UTF-8-Inhaltstyp. 

@Controller
@Scope("session") 
@RequestMapping(value={"/account"}, method = RequestMethod.GET,produces="application/json;charset=UTF-8")
public class AccountController {

   protected final Log logger = LogFactory.getLog(getClass());

   ....//More parameters and method here...

   @RequestMapping(value={"/getLast"}, method = RequestMethod.GET)
   public @ResponseBody String getUltimo(HttpServletResponse response) throws JsonGenerationException, JsonMappingException, IOException{

      ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
      try {
        Account account = accountDao.getLast();
        return writer.writeValueAsString(account);
      }
      catch (Exception e) {
        return errorHandler(e, response, writer);
      }
}

Sie müssen sich also nicht für jede Methode in Ihrem Controller einrichten. Sie können dies für die gesamte Klasse tun. Wenn Sie mehr Kontrolle über eine bestimmte Methode benötigen, müssen Sie nur den Rückgabetyp "Productions" ableiten.

1
miguel.angel

Wenn Sie Spring MVC Version 5 verwenden, können Sie die Kodierung auch mithilfe der Annotation @GetMapping festlegen. Hier ist ein Beispiel, das den Inhaltstyp auf JSON und den Codierungstyp auf UTF-8 setzt:

@GetMapping(value="/rest/events", produces = "application/json; charset=UTF-8")

Weitere Informationen zur @ GetMapping-Annotation finden Sie hier:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/GetMapping.html

0
gil.fernandes