윈도우에서 아래와 같은 파일, 폴더들을 WinToLinux.zip 파일로 압축한 상태이다.
파일 이름에 '나'들은 윈도우 메모장 인코딩 기본값인 UTF-8로 인코딩된 파일들이다.
파일 이름에 '나나'가 들어간 파일들은 사람에 의해 모두 ANSI(CP949로 커스텀인코딩됨)로 인코딩된 파일들이다.
그리고 파일질라를 통해서 AWS EC2의 test 디렉토리에 하위에 업로드한 상황이다.
[ec2-user@ip-172-31-41-52 test]$ ls -l
total 0
[ec2-user@ip-172-31-41-52 test]$ ls -l
total 12
-rw-rw-r-- 1 ec2-user ec2-user 8340 Sep 8 00:56 WinToLinux.zip
[ec2-user@ip-172-31-41-52 test]$ unzip WinToLinux.zip
Archive: WinToLinux.zip
inflating: en.txt
inflating: enen.txt
creating: english/
inflating: english/en.txt
inflating: english/enen.txt
inflating: Iaas나.txt
inflating: Iaas나나.txt
inflating: 나.txt
inflating: 나나.txt
inflating: 엑셀문서one.xlsx
creating: 한국어/
inflating: 한국어/나.txt
inflating: 한국어/나나.txt
[ec2-user@ip-172-31-41-52 test]$
[ec2-user@ip-172-31-41-52 test]$ file -i *
한국어: inode/directory; charset=binary
enen.txt: text/plain; charset=us-ascii
english: inode/directory; charset=binary
en.txt: text/plain; charset=us-ascii
Iaas나.txt: text/plain; charset=utf-8
Iaas나나.txt: text/plain; charset=iso-8859-1
엑셀문서one.xlsx: application/vnd.ms-excel; charset=binary
나.txt: text/plain; charset=utf-8
나나.txt: text/plain; charset=iso-8859-1
WinToLinux.zip: application/zip; charset=binary
[ec2-user@ip-172-31-41-52 test]$ file -i 나.txt
나.txt: text/plain; charset=utf-8
[ec2-user@ip-172-31-41-52 test]$ file -i 나나.txt
나나.txt: text/plain; charset=iso-8859-1
[ec2-user@ip-172-31-41-52 test]$
[ec2-user@ip-172-31-41-52 test]$ cat 나.txt
나의 인코딩은 유티에프 팔입니다.
[ec2-user@ip-172-31-41-52 test]$
[ec2-user@ip-172-31-41-52 test]$ cat 나나.txt
ڵ�� Դϴ.
[ec2-user@ip-172-31-41-52 test]$
cat 나나.txt 시 파일내용이 깨지는 현상이 포착된다.
이는 Window에서 작업 시 인코딩이 cp949지만, 리눅스에서는 UTF-8로 서로 다른 인코딩 때문이다.
나나.txt: text/plain; charset=iso-8859-1
유의할 점은 여기서 file 명령어(one utility of bash shell)로 인해 cp949가 iso-8859-1로 표기된다는 것이다.
우선 iso-8859-1은 한글과 관련 없는 '다양한 유럽어를 표현할 수 있는 확장 ASCII'이다.
실제로 위 정보가 잘못되었다는 것은 위 정보에 따라서 인코딩을 변경했을 때, 원하는 결과를 얻지 못한다는 실험을 통해 확인가능하다.
[ec2-user@ip-172-31-41-52 test]$ iconv -c -f iso-8859-1 -t utf-8 너너.txt > 너너유팔.txt
[ec2-user@ip-172-31-41-52 test]$ cat 너너유팔.txt
³ª³ªÀÇ ÀÎÄÚµùÀº ¿¡ÀÌ ¿£ ¿¡½º ¾ÆÀÌ ÀÔ´Ï´Ù.
[ec2-user@ip-172-31-41-52 test]$
파일전송 시, 목표이자 요구되는 리눅스의 인코딩을 locale이라는 명령어로 확인한다.
[ec2-user@ip-172-31-41-52 test]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
우선 LANG 이라는 것이 en_US.UTF-8이다. 핵심은 UTF-8을 쓰는것으로 생각하는 중.
아래와 같은 명령어를 통해 윈도우 서버 또는 노트북의 현재 인코딩을 확인가능하다
PS C:\Users\USER\Desktop> [System.Text.Encoding]::Default
BodyName : ks_c_5601-1987
EncodingName : 한국어
HeaderName : ks_c_5601-1987
WebName : ks_c_5601-1987
WindowsCodePage : 949
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
IsSingleByte : False
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 949
여기서 핵심은 CodePage : 949이다. 이는 인코딩 cp949(ms949 of java compile encoding)에 대응한다.
다만, 메모장, 노트패드와 같은 윈도우 운영체제의 응용어플리케이션 층은 UTF-8 이 기본이다.
현재에 이르러서는 윈도우 운영체제는 cp949, UTF-8을 혼용하여, 유니코드인 UTF-8로의 점진적인 전환이 계속되리라 생각된다.
상단 과정을 통해, 현재 인코딩은 cp949이고 목표 인코딩은 UTF-8임을 확인했다. 이에 따라서 인코딩을 전환해본다.
우선 원본을 복사해서 진행.
[ec2-user@ip-172-31-41-52 test]$ cp 나나.txt 너너.txt
[ec2-user@ip-172-31-41-52 test]$ iconv -c -f euc-kr -t utf-8 너너.txt > 너너유팔.txt
또는
[ec2-user@ip-172-31-41-52 test]$ iconv -c -f cp949 -t utf-8 너너.txt > 너너유 팔.txt
(euc-kr의 계열 속에 cp949가 속하기 때문에 둘다 가능)
깨지던 파일내용이 한글로 정상출력된다.
[ec2-user@ip-172-31-41-52 test]$ cat 너너유팔.txt
나나의 인코딩은 에이엔에스아이입니다.
[ec2-user@ip-172-31-41-52 test]$
확실히 한글 파일 이름이 깨지는 환경을 세팅하기 위해서는, VirtualBox로 최소 2008년 또는 2001년 이전의 윈도우 서버를 터미널로 접근해서 scp로 리눅스 서버로 전송하는 상황을 설정할 수 있다.
공식문서 상으로 2001년 이전 윈도우os일수록 utf-8로의 점진적인 업데이트가 안되어서 파일이름부터 깨질 것으로 예상된다.
하지만,
범용적인 해결책 결론은 우선 윈도우 서버에서 cp65001 상태로 파일 작업 및 utf-8로 인코딩해서 작업해서 보낸다. 로 정리
ms949란 명칭은 이클립스 환경설정할때 출현하나, 리눅스 서버에서아래와 같이 명령어 옵션값으로 인식 안된다.
[ec2-user@ip-172-31-41-52 test]$ iconv -c -f ms949 -t utf-8 너너.txt > 너너유팔.txt
iconv: failed to start conversion processing
반대로, 윈도우 파일에 맞추어 리눅스의 인코딩을 바꿔볼 수도 있다.
하지만, 더 효과적인 유니코드 utf-8로 전환하는 패러다임에 역행하는 행동이다.
그러나 꽤나 많은 과거의 글들이 그러했다. 그들의 사정이 있으리라
다만, 맞닥드린 리눅스 서버가 어떤 상황일지 모르니, 기록
한글 인코딩 종류
https://studyforus.tistory.com/167
인코딩이 ms949인 윈도우 에서 인코딩이 utf-8인 리눅스로 파일을 보내면 깨진다. => 근데 난 안깨짐. 정상작동이므로 우선패스
https://hamonikr.org/board_bFBk25/14127
리눅스 버그는 리눅스에게 맡기자 ; NOT iso-8859-1, CP949
https://daewoonginfo.blogspot.com/2020/01/linux.html
리눅스의 LANG 확인하기
https://8millimeters.tistory.com/11
리눅스 LANG 바꾸기 ; en_US.UTF-8 = change => kr_KR.euckr
https://mslee89.tistory.com/88
내 윈도우 노트북 인코딩 확인하기
https://vhxpffltm.tistory.com/243
리눅스에 올리기 전에 txt파일 인코딩을 utf-8로 변경해라
https://sysopt.tistory.com/14