장고 쓰면서 문자 인코딩 때문에 삽질

2023. 8. 10. 17:09일상, 개발로그

학교 프로젝트로 장고를 쓸 일이 있었다.

이미 장고로 프로젝트를 몇 번 해봐서 크게 어렵진 않았지만 하다가 인코딩 문제가 생겼다.

 

큰 문제는 아니었고

sqlite에 저장된 한글을 orm을 통해 읽어오고

그걸 HttpResponse를 통해 json으로 뿌려주는데

웹브라우저에서 보면 한글이 다 깨져서 '\uc815\ubcf4' 이런 식으로 유니코드로 나왔다.

 

\u로 시작하는게 유니코드라는건 알고 있었지만 파이썬에서 해당 텍스트를 .encode로 utf-8 인코딩 해보니 다르게 나와서 이 참에 utf-8에 대해 알아봤다.

 

https://www.youtube.com/watch?v=5IRFJt1C5o4&t=502s

 

utf-8이 유니코드로 인코딩하는 것이라는건 알았지만 이번에 정확히 어떻게 인코딩 하는 것인지 알아봤다.

 

.encode를 썼을 때 다르게 나오는건

예를 들어 '정'을 utf-8로 인코딩하면 \uc815로 표기하고 1110 1100 10 1000 00 10 01 0101 = 0xeca095이다.

\u를 쓸 때는 비트열과 달리 10 등의 구분자를 제외하고 표기하는데 .encode는 비트열을 그대로 출력해서 다르게 나오는 것이었다.

 

 

아무튼 왜 DB Browser로 볼 땐 한글이 제대로 저장되었는데 웹브라우저에서는 인코딩된 형태로 출력되나 봤더니

HttpResponse로 뿌려주기 전에 콘솔에 출력해보면 제대로 나온다.

내 생각에는 sqlite에서는 인코딩된 형태(e.g. \uc815)로 저장하고

콘솔에 출력할 때는 sys.stdout.encoding에 지정된 대로 utf-8로 디코딩해 출력하고

웹브라우저에는 그대로 출력된 것 같다.

 

'일상, 개발로그' 카테고리의 다른 글

종교에 대한 비판  (1) 2024.11.28
마크다운은 역시 벨로그  (0) 2024.06.18
M1 macOS  (0) 2022.08.23
[닌텐도 스위치] 젤다의전설 꿈꾸는섬  (0) 2022.08.15
요즘 하는 게임(젤다 야숨)  (0) 2022.07.03