[Linux] Encoding for UTF-8

adam adam·2022년 9월 7일
0

문제상황 : Win to Linux

문제 설정

윈도우에서 아래와 같은 파일, 폴더들을 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을 쓰는것으로 생각하는 중.

Windows 인코딩 확인

아래와 같은 명령어를 통해 윈도우 서버 또는 노트북의 현재 인코딩을 확인가능하다

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임을 확인했다. 이에 따라서 인코딩을 전환해본다.

euc-kr 에서 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란 명칭은 java 에서만

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로 전환하는 패러다임에 역행하는 행동이다.

그러나 꽤나 많은 과거의 글들이 그러했다. 그들의 사정이 있으리라

다만, 맞닥드린 리눅스 서버가 어떤 상황일지 모르니, 기록

출처

  1. 인코딩 바꾸기
    https://kurukurucoding.tistory.com/43

  2. 한글 인코딩 종류
    https://studyforus.tistory.com/167

  3. 인코딩이 ms949인 윈도우 에서 인코딩이 utf-8인 리눅스로 파일을 보내면 깨진다. => 근데 난 안깨짐. 정상작동이므로 우선패스

https://hamonikr.org/board_bFBk25/14127

  1. 리눅스 버그는 리눅스에게 맡기자 ; NOT iso-8859-1, CP949
    https://daewoonginfo.blogspot.com/2020/01/linux.html

  2. 리눅스의 LANG 확인하기
    https://8millimeters.tistory.com/11

  3. 리눅스 LANG 바꾸기 ; en_US.UTF-8 = change => kr_KR.euckr

https://mslee89.tistory.com/88

  1. 내 윈도우 노트북 인코딩 확인하기
    https://vhxpffltm.tistory.com/243

  2. 리눅스에 올리기 전에 txt파일 인코딩을 utf-8로 변경해라
    https://sysopt.tistory.com/14

0개의 댓글