IT story

JSON 문자 인코딩

hot-time 2021. 1. 6. 20:25
반응형

JSON 문자 인코딩


내 Java 웹 애플리케이션은 다음과 같은 JSON을 반환하는 AJAX 요청을 제출합니다.

{'value': 'aériennes'}

웹 페이지에 'aériennes'가 표시되면 'a'riennes'로 표시되어 문자 인코딩 문제가있는 것 같습니다. AJAX 응답 헤더에는 다음이 포함됩니다.

Content-Type    application/json

문자 세트 정보를 포함하지 않는 것 같습니다. 나는 이것을 다음과 같이 변경해야한다고 생각한다.

Content-Type    text/html; charset=iso-8859-1      (or charset=utf8)

앱의 서버 측은 Spring MVC이며 각 응답에 대한 기본 문자 집합을 설정하는 방법이 있어야한다고 생각합니다.


증상은 원래 UTF-8 인코딩이었던 JSON 문자열이 ISO-8859-1 인코딩을 사용하여 HTTP 응답에 기록되었고 웹 브라우저가이를 UTF-8로 표시하도록 지시했음을 나타냅니다. UTF-8을 사용하여 작성되었고 ISO-8859-1로 표시 되었다면 aériennes. ISO-8859-1을 사용하여 작성 표시 되었다면 a�riennes.

ISO-8859-1로 잘못 쓰여진 JSON 문자열 문제를 해결하려면 HTTP 응답 인코딩으로 UTF-8을 사용하도록 webapp / Spring을 구성해야합니다. 기본적으로 다음 작업을 수행해야합니다.

response.setCharacterEncoding("UTF-8");

콘텐츠 유형 헤더를 변경하지 마십시오. JSON에는 완벽하게 괜찮으며 UTF-8로 표시되었습니다.


이것이 더 이상 관련이 있는지 모르겠지만 @RequestMapping 주석으로 수정했습니다.

@RequestMapping(method=RequestMethod.GET, produces={"application/json; charset=UTF-8"})

첫째, 게시 된 데이터가 유효한 JSON이 아닙니다. 이것은 다음과 같습니다.

{"value": "aériennes"}

큰 따옴표에 유의하십시오. 필수입니다.

JSON 데이터에 대한 콘텐츠 형식이 되어야합니다 application/json . 실제 JSON 데이터 (위에있는 데이터)는 UTF-8, UTF-16 또는 UTF-32를 사용하여 인코딩해야합니다. UTF-8을 사용하는 것이 좋습니다.

Wireshark와 같은 도구를 사용하여 네트워크 트래픽을 모니터링하고 데이터가 어떻게 보이는지 확인할 수 있습니다 c3 89. é에 대한 바이트 확인해야합니다 . 나는 Spring과 함께 일한 적이 없지만 JSON 인코딩을 수행하는 경우 아마도 제대로 처리 될 것입니다.

JSON이 브라우저에 도달하면 유효하면 좋습니다. 그러나 JSON 응답의 데이터를 웹 페이지에 어떻게 삽입합니까?


마침내 해결책을 얻었습니다.

이 줄만 넣어

@RequestMapping(value = "/YOUR_URL_Name",method = RequestMethod.POST,produces = "application/json; charset=utf-8")

이것은 확실히 도움이 될 것입니다.


그것은 나에게 정확히 똑같이 일어났습니다.

<%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%>

그러나 이것은 나를 위해 작동합니다.

<%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%>

추가 시도

 ;charset=UTF-8

contentType에.


response.setContentType("application/json;charset=utf-8");

여기의 답변은 완전히 관련이 없지만 문제를 해결하는 데 도움이되었습니다. javax.ws.rs API와 @Produces 및 @Consumes 주석을 사용하고 동일한 문제가 발생했습니다. 웹 서비스에서 반환 한 JSON은 UTF-8이 아닙니다. 내 컨트롤러 기능 위에 다음 주석으로 해결했습니다.

@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")

@Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON + "; charset=UTF-8")

모든 엔드 포인트의 get 및 post 기능에서. 나는 문자 세트를 설정하지 않았고 이것이 해결되었습니다. 이것은 저지의 일부이므로 Maven 종속성을 추가해야 할 수도 있습니다.


사용하는 경우 선택한 문자 인코딩을 사용 하여 StringEntity시도 하십시오 . 외국 문자도 처리합니다.


또한 모든 응답에서 application / json; utf-8 을 수신하기 위해 컨트롤러 클래스 위에 스프링 주석 RequestMapping을 사용할 수 있습니다 .

@Controller
@RequestMapping(produces = {"application/json; charset=UTF-8","*/*;charset=UTF-8"})
public class MyController{
 ...
}

위의 제안 된 해결 방법으로 문제가 해결되지 않은 경우 (나의 경우) 도움이 될 수 있습니다.

내 문제는 Springs를 사용하여 응답에서 json 문자열을 반환한다는 것 @ResponseBody입니다. 이 작업을 수행하는 경우 도움이 될 수 있습니다.

디스패처 서블릿에 다음 Bean을 추가하십시오.

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean
                class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </list>
    </property>
</bean>

(여기에서 찾았습니다 : http://forum.spring.io/forum/spring-projects/web/74209-responsebody-and-utf-8 )

참조 URL : https://stackoverflow.com/questions/3995559/json-character-encoding

반응형