계발하는 개발자

[PHP] json_encode 유니코드 한글 깨짐 현상 해결 본문

❗️Error

[PHP] json_encode 유니코드 한글 깨짐 현상 해결

dev_genie 2023. 9. 6. 02:53

일반적으로 PHP에서 Array 데이터를 JSON 포맷으로 출력하려고 하는 경우,

아래와 같이 json_encode 함수를 호출해서 데이터 변환이 가능하다.

 

에러

그런데 뭣모르고 호기롭게 json_encode 함수로 데이터 출력할라치면 아래와 같은 페이지를 마주하게 될거다.한글이 들어간 부분만 죄다 깨져서 나온다...

사실 그렇더라도 클라이언트에서 막상 서버로부터 api호출해서 받은 데이터는 정상적인 한글 형태로 잘 출력되어서 별 문제가 아니다 넘어갈 수도 있을듯하다.

클라이언트에서 받은 서버측 데이터

클라이언트에서 JSON 데이터를 전달 받았을 때 브라우저에 의해 자동으로 파싱(디코딩)되는 특성 탓에

클라이언트에서는 위와 같이 정상적으로 출력이 되는듯하다.

그렇다 하더라도, 데이터 통신에 있어서 언제나 데이터가 일관되고 안전한 상태로 전달되는 게 가장 중요하기 때문에 서버측 데이터에서 한글이 유니코드화 되어서 출력되는 부분을 간과할 수 없다.(는 생각이다)

 

원인

이러한 현상이 나타나는 이유를 찾아보니 php에서 json_encode 를 사용해서 JSON 문자열로 변환시키려고 할 때

데이터 안에 한글이 포함되어 있으면 한글을 유니코드 형태로 자동 변환(인코딩)해서 출력시키기 때문에,

별도의 decode 작업을 거쳐서 사용해야 한단다.

✅ json_encode 함수
PHP 내장 함수 중 하나로, PHP 배열이나 객체를 JSON 문자열로 변환하는 데 사용된다.

또한, json_encode 함수는 기본적으로 Unicode 이스케이프 시퀀스를 생성하여 JSON 문자열을 만든다.
-> 왜 그럴까?
1. 데이터 안정성: JSON은 특수 문자와 이스케이프 문자를 일반 텍스트와 구분할 수 있도록 이스케이프 시퀀스를 사용한다. 이렇게 하면 데이터가 파싱될 때 특수 문자가 부정확하게 해석되거나 오용되는 것을 방지할 수 있다.

2. 데이터 일관성: JSON은 모든 문자열을 동일하게 다루므로 언어나 문자셋에 관계없이 데이터를 표현할 수 있다. 이것은 국제화 및 다국어 지원을 위해 중요하다.

3. 전송 효율성: 이스케이프된 유니코드 문자열은 전송 중에 일부 특수 문자로 인해 문제가 발생하지 않도록 도와준다. 예를 들어, JSON 내에 큰 따옴표나 역슬래시가 포함된 경우, 이스케이프된 문자열로 표현함으로써 데이터가 유실되거나 왜곡되는 것을 방지한다.

4. 보안성: 이스케이프된 문자열은 악의적인 공격으로부터 데이터를 보호하는데 도움이 된다. 예를 들어, 인젝션 공격을 방지하기 위해 데이터를 이스케이프하여 안전하게 처리할 수 있다.

 

해결

유니코드 문자열 인코딩이 안되게 별도의 옵션을 걸어서 해결할 수 있었다.

이렇게 하면 유니코드 문자열로 인코드되는 걸 막아주기 때문에, 

이제 한글 데이터가 정상적으로 잘 출력되게 된다.

LIST
profile

dev_genie

@dev_genie

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!