Unsupported characters for the charset 'ISO-8859-1' 경고 메세지의 발생 원인
이 메세지는 .properties 파일의 기본 인코딩이 ISO-8859-1 로 되어 있는데, 해당 인코딩으로 지원하지 않는 문자열을 쓸 때 발생한다.
이런 경우 경고를 무시하고 애플리케이션을 실행할 경우, 해당 문자를 읽으면 '????' 로 표기된다.
예를 들어 /bloginfo/kotlinworld 경로의 응답을 처리하는 함수를 만들어보자. 이 함수는 Accept-Language 값을 읽어 Locale 객체로 변환한다.
@GetMapping("/bloginfo/kotlinworld")
fun getBlogInfo(
@RequestHeader("Accept-Language") locale: Locale
): ResponseEntity<BlogInfo> {
val blogInfo = BlogInfo(messageSource.getMessage("blogname", arrayOf("not valid"), locale), 3)
return ResponseEntity.ok(blogInfo)
}
이때 우리가 이 경로로 HTTP 요청을 날리면서 Accept-Language를 ko-KR로 설정하면, messages_ko_KR.properties의 blogname 값을 읽게 된다. 예를 들어 다음과 같이 요청을 날려보자.
GET http://localhost:8081/bloginfo/kotlinworld
Accept-Language: ko-KR
그러면 다음과 같은 응답을 받게 된다.
한국어 문자열이 '????'로 바뀐 것을 볼 수 있다. 이는 파일의 인코딩이 ISO-8859-1이기 때문에 한국어를 처리할 수 없어서 문자열이 깨져서 그렇다.
문제 해결 방법
문자열 깨짐 현상 문제를 해결하기 위해서는 properties 파일의 인코딩을 ISO-8859-1에서 ASCII로 바꿔야 한다. 이를 위해서는 IntelliJ의 Preference 메뉴 진입 후 File Encodings 탭에 진입해 Transparent native-to-ascii conversion에 체크하면 된다.
설정을 적용하면 파일의 한국어가 '????' 로 같이 바뀐 것을 볼 수 있다. ISO-8859-1 에서 처리할 수 없는 문자가 인코딩이 ASCII로 바뀌면서 '????' 로 바뀐 것이다.
이제 다시 한국어를 적어주자. 그러면 경고가 사라진 것을 볼 수 있다.
이제 다시 스프링 앱을 실행하고 다음 HTTP 요청을 실행해보자.
GET http://localhost:8081/bloginfo/kotlinworld
Accept-Language: ko-KR
그러면 응답이 정상적으로 오는 것을 확인할 수 있다.