우선 나의 경우 vscode를 메인 에디터로 사용하고 있으며 CLI 또한 iterm2 보다 vscode 하단의 터미널을 자주 애용한다.
문제는 vscode의 터미널을 사용해 git log로 지난 커밋들을 확인할때 한글이 깨지는 현상이 발생한다는 것이다...
영문의 경우 잘 나오지만 한글의 경우 깨짐현상이 나타난다.
하지만 iterm2 에서는 깨짐현상이 나타나지 않는것을 확인할 수 있었다.
iterm2에서는 잘 나오는데,,, 이상하게 vscode 에서만 말썽이다. 왜 그럴까,,😑
생각보다 문제는 가까운데 있음을 알수 있었다.
바로 위의 iterm2 의 경우 상단 탭에 LANG=en_GB git log
이라 나와있는데
이는 내가 일전에 alias 를 통해 git 을 실행할때 로케일(locale) 값을 영문으로 설정해준 것이다.
과거의 내가 이렇게 발목을 잡는다...
당시 기억으론 git 을 사용할때 에러 로그들이 한글로 나와 git 커맨드 한정으로 로케일 값을 en_GB로 주었던 것 같다.
즉, git 의 커맨드가 실행될때 마다 실제로는 $ LANG=en_GB git *
의 형태로 실행되고 있었던 것이다.
여기서 로케일 값의 형식에 대해 이해한 것을 바탕으로 간략하게 요약하면
language[_territory][.codeset][@modifier]
의 형식을 따르며
en_GB 는 en(영어), _GB(영국) 그리고 .다음에 위치하는 코드셋은 빠져 있는 형태다.
그렇다면 왜 vscode 에서만 말썽인걸까?
둘다 git
커맨드를 사용하면 로케일의 LANG값을 en_GB로 설정하는건 동일하지 않나?
그래서 두 환경에서 실제 $ locale
커맨드를 사용하여 로케일 설정값을 확인해보았다.
(vscode)
(iterm2)
두 환경에서 로케일 설정값에 차이가 있다.
아마 두 환경에서 환경변수에 차이가 있는것 같아 $ env
를 통해locale 관련 환경변수들을 살펴 보았으며
vscode 에서는 LANG=en_US.UTF-8
, iterm2 에서는 LC_CTYPE=UTF-8
로케일 설정 관련 환경변수가 있었다.
여기서
LANG
과 LC_ALL
의 경우 전역에서의 로케일 설정값을 의미한다.
하지만 LC_ALL
의 경우 우선순위가 가장 높으며 다른 LC_*
의 값들을 LC_ALL
로 덮어쓴다.
LANG
의 경우는 LC_*
의 값들을 설정하지 않았을때 적용되는 기본값이며 만약 LC_TIME
가 설정된 경우
해당 값을 제외하고 설정이 없는 나머지LC_*
들을 LANG
으로 설정한다.
즉 LANG
의 경우 우선순위가 가장 낮다.
정리하면 두 환경에서 git
커맨드 실행시 동일하게 LANG
의 값으로 en_GB
가 설정되지만, iterm의 경우 LC_CTYPE
이 UTF-8
로 설정 되어 있어 해당 값은 유효하다.
하지만 vscode의 경우 LC_CTYPE
마저 en_GB
로 설정되어 문자셋, 인코딩 방식이 달라지게 된다.
LC_CTYPE : 문자 분류(알파벳, 숫자, 한글 또는 소문자, 대문자 등등), 변환,
대소문자 비교을 위한 로케일 설정을 의미한다. 이것은 예를 들어 fgetwc(), is(),
isw(), mblen(), mbtowc(), wcstombs() 등의 함수에 영향을 줄 수 있다.
그렇다면 로케일 값으로 코드셋을 정의 해주면 해결되는 문제 아닌가??
정말 코드셋을 UTF-8
로 정의해 주었더니 한글이 깨짐 없이 잘 나오는것을 확인할 수 있었다.
$ vi ~/.zshrc
# en_GB 에서 코드셋을 추가해 en_GB.UTF-8로 수정
alias git="LANG=en_GB.UTF-8 git"
# 편집하고 저장한 뒤, source ~/.zshrc 로 해당 환경변수 다시 읽기
git log
이제 vscode의 터미널에서도 한글이 깨짐없이 잘 나온다.
오랬동안 고통받던것이 해결되어 기쁘지만 한편으로는 해당 로케일에 대해 완벽히 이해를 했다고 보기 힘들기에
앞으로 좀더 알아볼 예정이다!
http://coffeenix.net/doc/misc/locale.html
https://www.44bits.io/ko/keyword/locale
https://velog.io/@dpdnjs402/lk5b90sq