Ajax를 이용해 json 데이터를 파싱할 때 간혹 한글이 깨지는 현상을 겪곤했습니다.
그 때마다 구글링해서 해결했었는데 이번 기회에 정리를 해놓으려고 합니다.
문제가 발생한 구간은 Ajax로 서버 호출, 데이터를 json 타입으로 받은 후 출력하는 부분.
(아래와 같이 한글이 물음표(?)가 되어 출력되었다)
jsp 상단에는 캐릭터셋과 인코딩 타입을 UTF-8로 맞춰놓은 상태였고, ajax의 contentType 속성에도 캐릭터셋을 UTF-8로 맞춰놓았다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
jsp
var getCompany = function() {
var eventData = {
cduser : "0001"
};
$.ajax({
type: "POST",
url: "/board/getCompany.ajax",
cache: false,
dataType: "json",
data: JSON.stringify(eventData),
contentType: "application/json; charset=utf-8",
success: function(data) {
var resultList = data;
for(var i = 0; i < resultList.length; i++){
alert(resultList[i].cmpCode + "/" + resultList[i].cmpName);
}
},
error : function(request, status, error) {
alert(request.status + "," + request.responseText + ", " + error);
}
});
}
Controller.java
@RequestMapping(value= "/board/getCompany.ajax", method = RequestMethod.POST)
public @ResponseBody String getCompany(@RequestBody String filterJSON, HttpServletRequest request) {
JSONObject result = new JSONObject();
JSONObject json = (JSONObject) JSONValue.parse(filterJSON);
JSONArray jsonArray = new JSONArray();
String cduser = String.valueOf(json.get("cduser"));
List<BoardVO> resultList = boardService.getCdcmp(cduser);
for(int i = 0; i < resultList.size(); i++) {
BoardVO boardVO = resultList.get(i);
result = new JSONObject();
result.put("cmpCode", boardVO.getCmpcode());
result.put("cmpName", boardVO.getCmpname());
jsonArray.add(result);
}
return jsonArray.toJSONString();
}
해결은 간단하다.
@RequestMapping의 produces 속성을 사용해 UTF-8 인코딩을 해서 다시 클라이언트로 내보내주면 한글이 정상적으로 나오게 된다.
@RequestMapping(value= "/board/getCompany.ajax", method = RequestMethod.POST, produces = "application/text; charset=UTF-8")
public @ResponseBody String getCompany(@RequestBody String filterJSON, HttpServletRequest request) {
JSONObject result = new JSONObject();
JSONObject json = (JSONObject) JSONValue.parse(filterJSON);
JSONArray jsonArray = new JSONArray();
String cduser = String.valueOf(json.get("cduser"));
List<BoardVO> resultList = boardService.getCdcmp(cduser);
for(int i = 0; i < resultList.size(); i++) {
BoardVO boardVO = resultList.get(i);
result = new JSONObject();
result.put("cmpCode", boardVO.getCmpcode());
result.put("cmpName", boardVO.getCmpname());
jsonArray.add(result);
}
return jsonArray.toJSONString();
}
+++++++
[Window - Preferences - General - Workspace] 경로에 Text file encoding이 UTF-8로 되어있지 않은 경우 한글이 깨지기도 했다.