팁과 강좌

수치 처리기인 컴퓨터에서 숫자(2진수)와 문자를 서로 대응시키기 위해서는 문자 집합을 만들고 이를 코드화해야 합니다.  여기서 얘기하는 문자는 키보드 상에 새겨진 알파벳, 세계 각국의 문자, 숫자, 특수문자 뿐만 아니라 기타 제어 문자를 포괄합니다. 

이렇게 만들어진 문자 집합을 코드화된 문자 집합(CCS, coded character set)이라고 합니다.
ASCII(미국 표준), ISO 8859-1(서유럽 언어), ISO8859-2(중앙 유럽 언어), EUC-KR(행정용 한글), CP949(MS-949, MS社 한글), 유니코드, ... 등등 다양한 인코딩 방식이 있습니다. 참고로 EUC-KR은 2,350자의 한글, CP949는 11,172자의 한글을 표현할 수 있습니다.

전 세계적으로 사용되는 모든 문자 집합을 모아 탄생시킨 것이 유니코드 입니다. 유니코드 값을 나타내기 위해서는 코드 포인트(code point)를 사용하는데, 보통 U+를 붙여 표시합니다. 유니코드의 인코딩 방식으로는 코드 포인트를 코드화한 UCS-2와 UCS-4, 변환 인코딩 형식(UTF, UCS Transformation Format)인 UTF-7, UTF-8, UTF-16, UTF-32 인코딩 등이 있다. 이 중 ASCII와 호환이 가능하면서 유니코드를 표현할 수 있는 UTF-8 인코딩이 가장 많이 사용됩니다.

한글 윈도우는 CP949(MS949)가 기본 인코딩입니다. 리눅스는 LANG 환경 변수에 따라 EUC-KR(ko, ko_KR, ko_KR.eucKR)과 UTF-8 인코딩 방식을 사용합니다. 한글이 깨지는 주요 원인은 한글 윈도우와 리눅스에서 사용하는 코드화된 문자 집합이 서로 다르기 때문입니다.  이렇게 서로 인코딩 방식이 달라서 생기는 몇가지 문제의 해결 방법을 알아 보겠습니다.

아래의 내용은 모두 리눅스의 로캘(locale)이 UTF-8이라고 가정하고 설명되었습니다.
확인은 터미널에서 echo $LANG 또는 locale 명령으로 확인 가능합니다.
출력 결과:
LANG=ko_KR.UTF-8


1. ZIP 압축 파일의 한글 깨짐

터미널에서 압축을 풀 때 문자 인코딩 옵션(대문자 O)을 직접 지정해 줍니다.

$ unzip -O cp949 <압축파일.zip>

이런 식으로 매번 옵션을 사용하면 매우 번거롭죠. 번거로움 없이, 파일 관리자의 "여기에 풀기"에서도 사용하려면  /etc/profile (모든 사용자용) 또는 ~/.profile (현재 사용자용) 에 추가적인 설정이 필요합니다.

편집기(gedit, pluma, nano)로 파일을 열고
$ gksu gedit /etc/profile

또는
$ gedit ~/.profile

파일의 맨 끝에 아래 문장을 추가하고 저장합니다.

## Zip 압축 해제시 기본 인코딩을 CP949로 지정
export UNZIP="-O cp949"
export ZIPINFO="-O cp949"

로그아웃-로그인하고 zip 압축 파일을 풀어보면 한글이 정상적으로 잘 보입니다. 하지만, 이런 식으로 프로파일에 기본 인코딩 옵션을 지정하면 한글 윈도우에서 압축한 것이 아닐 때(다른 인코딩일 경우) 깨진다고 하네요.

한글 윈도우에서 zip 대신에 rar로 압축하고 리눅스에서 풀어 보면 파일명과 텍스트의 한글이 잘 보입니다.  아마도 압축 파일 내부에 문자 인코딩 정보를 가지고 있는듯 합니다. 7zip도 문제가 없다고 하는데 사용을 안 해봐서 모르겠네요. 7zip이 좋다고 하네요. 가능하면 zip 대신에 rar, 7z를 사용하는게 좋겠습니다.


2. 텍스트 파일의 한글 깨짐

gedit의 "파일 열기" 대화 상자에서 하단에 위치한 문자 인코딩"한국어(UHC)"로 선택하고 열기합니다.

저장은 "다른 이름으로 저장" 대화 상자에서 하단에 위치한 "문자 인코딩: 로캘(UTF-8), 줄 바꿈: 유닉스/리눅스"로 선택하고 저장합니다.


3. 인터넷에서 받은 파일명이 깨짐

파이어 폭스로 파일을 받다보면 %로 시작되면서 영어 대문자 조합으로 된 파일명이 있습니다.
(그런데 같은 파일을 크롬이나 오페라로 받으면 자동 변환되어 정상적이네요.)

예를 들면 이런 식으로요.
%EC%84%B8%EA%B3%84%EA%B2%AC%EB%AC%B8%EB%A1%9D

파일의 이름이 이와 같으면  URL 디코딩이 필요합니다.

방법 1) 아래의 웹 페이지에서 디코딩하세요. (URL, Decode, UTF-8 체크)

http://coderstoolbox.net/string/#!encoding=url&action=decode&charset=utf_8


방법 2) 구글의 웹 스토어에서 '유니코드 변환기'라는 확장 프로그램을 설치해 보세요.

메뉴 표시(작대기3개) > 도구 더 보기 > 확장 프로그램 > 더 많은 확장 프로그램 다운로드를 클릭합니다.
웹 스토어가 열리면 "유니코드"를 검색하고 거시기 확장 프로그램을 설치합니다. 

사용 방법은 브라우저의 우측-상단 구석에 있는 유니코드 변환기 아이콘을 누르고 Percent encoding for URIs 입력란에 파일명을 붙여 넣고 변환하시면 됩니다.


방법 3)  터미널 명령으로도 URL 디코딩이 가능합니다.

## 별칭(에일리어스alias) 지정 및 확인
$ alias urldecode='python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'
$ alias

## urldecode 사용법
$ urldecode %EC%84%B8%EA%B3%84%EA%B2%AC%EB%AC%B8%EB%A1%9D

터미널을 닫으면 urldecode라는 alias는 사라집니다.
계속적으로 사용하려면 profile 또는 bashrc 파일에 이 alias를 추가해 줘야합니다.


4. 잘못 인식된 문자 인코딩 알아보기
(이 부분은 다소 실험적인 내용이므로 안 보셔도 됩니다.)

이 내용은 문제 해결 방법을 잘 몰랐을 때 인터넷으로 자료를 검색하다가 iconv와 convmv라는 명령어를 알게 되어서 작성한 것입니다.

파일 내용을 인코딩 변환할 때는 iconv를 사용하고, 파일명과 폴더명에 대한 인코딩 변환할 때는 convmv를 사용한다네요. 깨진 한글을 되살리기 위해 저 명령을 사용해 볼려니까 벌써 UTF-8 변환이 되었더라구요. 그래서 cp949가 아닌 어떤 문자 집합(CCS)으로 부터 변환이 된 것인지 알아보기 위해 스크립트를 작성해서 돌려봤습니다.

그 결과...
텍스트 파일은 ISO-8859-15 (LATIN-9)로 인식 되어서 한글이 깨진 것이고,
zip 파일은 CP866 (IBM866)으로 인식 되어서 한글이 깨진 것이었습니다.

그래서 다시 역과정을 통해 ISO-8859-15나 CP866을  CP949로 바꿔서 UTF-8로 변환하니까 텍스트 및 파일(폴더)명의 한글이 제대로 잘 보였습니다.

$ cat find_charset.sh
#!/bin/bash
for filename
do
for x in `cat charsets_list`; do
OUT=`echo $x:; echo "$filename" | iconv -c -f utf-8 -t $x | iconv -c -f cp949 -t utf-8`;
echo $OUT;
done

$ sh find_charset.sh "깨진 한글" > out.txt
--> out.txt 파일을 열어보면 잘못 인식된 문자셋에서 한글이 제대로 보임니다.

[첨부 파일: charsets_sh.tar.gz ]


P.S.
제가 전문가가 아닌 사용자의 입장에서 쓴 글이므로 다소 잘못된 내용이 있을 수 있습니다. 틀린 부분을 발견하시면 댓글 달아주세요. 수정하도록 하겠습니다.
감사합니다... ^_^

참고한 웹 페이지:
한글 인코딩의 이해 1편: 한글 인코딩의 역사와 유니코드
http://helloworld.naver.com/helloworld/textyle/19187
한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리 
http://helloworld.naver.com/helloworld/76650
우분투에서 zip 파일 한글 깨짐 현상 해결하기!
http://forum.falinux.com/zbxe/index.php?mid=lecture_tip&page=3&document_srl=831895
우분투(리눅스)에서 zip 파일 압축 해제시 한글 깨짐 문제 해결 방법
http://kwanseob.blogspot.kr/2013/02/zip.html
[완료]윈도우 파일을 우분투에서 읽으면 한글이 깨져요..;;
https://kldp.org/node/113687
윈도우즈와 리눅스의 TXT 호환 문제, 압축파일 한글깨짐 문제
http://hamonikr.org/index.php?document_srl=6082&mid=board_bFBk25
linux에서 zip으로 한글이 포함되어있는 파일을 압축할때 인코딩하는 옵션이 있나요..?
https://kldp.org/node/109408

번호 제목 날짜 글쓴이 최종 글 조회 수
99 화이어 폭스에서 한번 클릭으로 주소창 열기 [3] 2016.01.26 guelph 2018.04.18 by Myscha the Sleddog 303
98 민트와 우분투에 대해 잘못알고있는 사실들 10가지. [1] 2017.03.29 오마이배베 2018.02.07 by Gfrog 962
97 GUI 방식의 Grub 편집 툴 소개 [3] file 2013.10.15 RobinC 2017.11.25 by 감동 4278
96 듀얼 부팅 시스템에서 시간이 달라지는 문제 [4] 2016.07.02 jeyul 2017.11.17 by AmBi 4961
95 다양한 시스템 종료 방법들... 2017.10.30 손님1   112
» zip 압축 파일 및 텍스트 파일의 한글 깨짐 해결 방법 [4] file 2015.05.08 jeyul 2017.10.21 by 라별 19540
93 리브레오피스 Calc 몇가지 팁입니다. [2] 2014.06.12 YoungBin Ko 2017.09.02 by Nam1956 2526
92 nvidia 드라이버 설치 후 plymouth 고치기 [1] 2017.08.11 jeyul 2017.08.13 by . 190
91 로그인 화면 뜰 때 자동으로 NumLock 키 켜기 2017.08.11 jeyul   156
90 Network-manager/Wireless issue on Linux Mint 18 2017.07.17 jeyul   130
89 키보드 셋팅좀 알려주세요 [1] 2017.03.11 수박찐맛 2017.05.17 by 348
88 Dash to Panel Extension 설치하기 file 2017.01.27 bagjunggyu   256
87 저장소 업데이트 에러 해결방법. [4] 2017.01.07 아카시아 2017.01.10 by 글쓴이 607
86 손쉽게 grub 부트로더 복구하기 [3] 2014.06.11 ㅁㄴㅇㄹ 2016.12.14 by 민트초보 5741
85 짧고 굵은 팁 하나~ [1] 2016.12.01 NobleRi 2016.12.01 by 노블리 416
84 윈도우 듀얼부팅시 마운트 오류가 날 때 해결법 [1] 2016.09.28 LoveMint 2016.10.09 by 너와나의눈높이~♡ 622
83 짧은 팁 하나. [2] 2015.10.13 김나리 2016.10.07 by ... 417
82 라인인 사운드(Line-in Sound)가 나지 않을 때 2016.09.25 LoveMint   145
81 레노보 씽크패드 지문인식 기능(tested S440) [2] 2016.01.08 june2017 2016.07.12 by 신기루 1613
80 하드디스크를 대기 모드(standby mode)로 두기 [4] 2015.05.11 jeyul 2016.07.11 by 그냥 2085
나의 소셜 정보
powered by SocialXE