개발

브라우저별 JSON default encoding

mycloudy 2021. 8. 14. 15:06

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을 지정하면 됩니다