브라우저별 JSON default encoding
JSON 기본 인코딩은 UTF-8 입니다
이는 RFC 7159 (JSON 문서)에 기술되어 있고
브라우저에서도 공식적으로 따르고 있습니다
- 크롬 브라우저는 62.0부터 따르고 있고
- 파이어폭스는 53부터 따르고 있습니다
- Safari는 XMLHttpRequest 인 경우 기본적으로 UTF-8 인코딩입니다
RFC 7159 (JSON 문서)
RFC 7159 (JSON 문서)에 JSON 인코딩의 기본은 UTF-8이라고 명시하고 있습니다
https://datatracker.ietf.org/doc/html/rfc7159#section-8.1
브라우저들 JSON 인코딩 이슈 티켓과 JSON 요청 결과
크롬
https://bugs.chromium.org/p/chromium/issues/detail?id=438464 (버그 이슈)
https://chromium-review.googlesource.com/c/chromium/src/+/587829
크롬에서는 Use UTF-8 as default encoding for JSON 제목으로 올라왔고 Merged 되었습니다
XMLHttpRequest과 랜더링에서도 UTF-8을 따릅니다
파이어폭스
https://bugzilla.mozilla.org/show_bug.cgi?id=741776
내용을 읽어보시면 개발자의 불편함에 대한 분노를 느낄 수 있습니다
XMLHttpRequest과 랜더링에서도 UTF-8을 따릅니다
Safari
https://bugs.webkit.org/show_bug.cgi?id=197369
DescriptionSébastien Deleuze (Spring MVC commiter)가 남긴 코멘트가 보입니다
DescriptionSébastien Deleuze 2019-04-29 08:55:20 PDT
Hey,
I am one of the committer of Spring Framework working on our web support (Spring MVC) and we would like to stop specifying artificially UTF-8 charset for JSON (with "application/json;charset=utf-8", see https://github.com/spring-projects/spring-framework/issues/22788 for more details) since per spec "application/json" does not support charset parameter (https://tools.ietf.org/html/rfc7159#section-11) and UTF-8 should be used by default (https://tools.ietf.org/html/rfc8259#section-8.1). This very annoying bug has been fixed in September 2017 in Chrome (see https://bugs.chromium.org/p/chromium/issues/detail?id=438464) and Firefox renders as well correctly special characters with "application/json" so Safari is the last big player to not handling that correctly.
To reproduce the bug, as described in the Chrome issue please compare rendering of http://thax.hardliners.org/issue438464.php?json=1 with Firefox, Chrome and Safari. Firefox and Safari render correctly the special characters while Safari does not.
Thanks in advance for your help on this issue.
XMLHttpRequest에서는 UTF-8이 기본 encoding입니다
하지만 랜더링에서는 UTF-8이 아님을 알 수 있습니다 (html 파일의 인코딩을 따르는 걸로 생각됩니다)
스프링에서
https://github.com/spring-projects/spring-framework/issues/22788
Deprecate MediaType.APPLICATION_JSON_UTF8 in favor of APPLICATION_JSON에서 스프링이 개발자에게 XMLHttpRequest 요청에서 JSON은 기본 인코딩이 UTF-8 임을 알려주고 있습니다
그래서 MediaType.APPLICATION_JSON_UTF8을 Deprecated 시켰고 MediaType.APPLICATION_JSON_UTF8을 사용하도록 하고 있습니다
스프링 적용
Spring controller에 @RequestMapping에 produces 필드에 응답 content-type을 지정하면 됩니다