Git 한글 깨짐 해결 + 원인

Tae-Kyun Kim·2022년 5월 9일
2
post-thumbnail

현상

touch hello
❯ touch 안녕
❯ touch 안녕ㅎ
❯ gst
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	hello
	"\354\225\210\353\205\225"
	"\354\225\210\353\205\225\343\205\216"

nothing added to commit but untracked files present (use "git add" to track

git에서는 보통 다음과 같이 한글이 깨진다. 왜 깨지게 되는걸까?

해결법

git config --global core.quotepath false

해결법부터 말하면 다음 quotepath 옵션을 끄면 해결이 된다.

quotepath

https://git-scm.com/docs/git-config

core.quotePath

Commands that output paths (e.g. ls-files, diff), will quote "unusual" characters in the pathname by enclosing the pathname in double-quotes and escaping those characters with backslashes in the same way C escapes control characters (e.g. \t for TAB, \n for LF, \\ for backslash) or **bytes with values larger than 0x80 (e.g. octal \302\265 for "micro" in UTF-8)**. **If this variable is set to false, bytes higher than 0x80 are not considered "unusual" any more**. Double-quotes, backslash and control characters are always escaped regardless of the setting of this variable. A simple space character is not considered "unusual". Many commands can output pathnames completely verbatim using the -z option. The default value is true.
  • output paths 들이 pathname에서 “unusual”한 문자들 앞에는 escape 문자 () 를 앞에 달아줌
  • unusual character
    ❯ ls
    he\llo    hello     안"녕     안녕      안녕ㅎ
    ❯ gst
    On branch master
    
    No commits yet
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    	"he\\llo"
    	hello
    	"\354\225\210\"\353\205\225"
    	"\354\225\210\353\205\225"
    	"\354\225\210\353\205\225\343\205\216"
    
    nothing added to commit but untracked files present (use "git add" to track)
    • C escapes control characters (\t for TAB, \n for LF, \ for backslash)
    • 0x80 보다 큰 변수
  • 옵션에 상관 없이 쌍따음표, 백슬래쉬, control characters 들은 항상 escape 처리됨 ()
  • 단일 스페이스는 ‘unusual’로 처리되지 않음

UTF-8

https://ko.wikipedia.org/wiki/UTF-8

UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방법.

U+3131 ~ U+CB4C 를 사용하는 한글 유니코드는 3바이트 표현 (1110xxxx 10xxxxxx 10xxxxxx) 을 사용하게 되고 위에서 언급했던 8진수 0x80 (2진수 10000000 ) 보다 크기 때문에 각각 백슬래시가 앞에 붙어서 나오게 됨

검증

안녕이라는 파일이 \354\225... 같이 나옴

안녕을 16진수로 인코딩해보면 '안'은 16진법 'xec'이고 10진수로는 236, 8진수로는 354가 됨. 앞에 깨졌던 것과 동일한 것을 볼 수 있음

UTF-8로 직접 표현해보기

https://memory.loc.gov/diglib/codetables/9.3.html

'안' 은 16진법 'C548'에 해당

이진법으로 변환하면 위와 같고, 이 이진값 16자리를 한글에 해당하는 3byte UTF-8 표기인 1110xxxx 10xxxxxx 10xxxxxx 에 x에 맞게 순서대로 넣으면 11101100 10010101 10001000 이렇게 됨

이 이진수는 10진수로 236, 8진수로 354인것을 확인할 수 있다!!

Reference

https://jyami.tistory.com/89

https://velog.io/@code_angler/파이썬-진수변환2진법-3진법-5진법-10진법n진법

0개의 댓글