Mac 한글 파일명 깨짐 문제 해결하기 – R을 사용한 간단한 URL디코딩 방법

인터넷에서 파일을 다운로드할 때 파일 이름이 %EA%B5%AC%EC%97%AD%EC%9D%98%... 이와 같이 저장되는 경우가 종종 있다. 한글이 깨져서 저장된건 아니고 맥(Mac) 환경에서 다운로드한 파일이 한글 대신 URL 인코딩된 형태로 저장되는 경우인데, 이런 파일명을 R 프로그램을 사용하여 한글로 제대로 수정하는 과정을 정리해본다.

변환이 안되는 경우도 있다?

혹시 김동률_ì‚°ì±?.mp3 처럼 정말 깨진듯한 문자열로 받아졌다면, 그걸 사파리에서 다운받은 파일이라면, 아직 제대로 변경하는 방법을 찾지는 못했다. 구글링 해보니, 사파리 오류라니, 맥os 업데이트 받아야 한다느니 말은 많은데, 결국 크롬에서 다운받으면 제대로 잘 받아진다. 이런 문제가 있으신 분들은 그냥 크롬으로 받으시면 된다. 위에 파일이 크롬에서 받은 파일이고, 아래 파일이 사파리에서 받은 파일이다.

파일이 몇개 안되면, 웹사이트로 해결.

%EA%B5%AC%EC%97%AD%EC%9D%98%... 처럼 URL인코딩으로 잘못내려온 경우는 변환이 가능하다. 사실 파일명 변경해야하는게 몇개 안된다고 하면 https://meyerweb.com/eric/tools/dencoder/ 이런 사이트에 접속해서 decode 처리하고, 파일명을 건건이 수정하시면 된다.

파일이 많다면, 간단한 R프로그래밍으로 가능

필요한 라이브러리는 아래 정도이다.

library(dplyr)
library(purrr)
library(stringr)
library(tibble)

특정 폴더에 있는 파일들의 전체 경로를 가져온다. 여기서 full.names = T 옵션을 줬기 때문에, 각 파일의 경로가 절대경로 형태로 출력된다. 그런데 문제는 이 파일들이 URL 인코딩된 상태로 되어있다는 것이다.

list.files('~/data/map/구역의도형/202409', full.names = T)

 [1] "/data/map/구역의도형/202409/%EA%B5%AC%EC%97%AD%EC%9D%98%EB%8F%84%ED%98%95_%EC%A0%84%EC%B2%B4%EB%B6%84_%EA%B0%95%EC%9B%90%ED%8A%B9%EB%B3%84%EC%9E%90%EC%B9%98%EB%8F%84.zip"
 [2] "/data/map/구역의도형/202409/%EA%B5%AC%EC%97%AD%EC%9D%98%EB%8F%84%ED%98%95_%EC%A0%84%EC%B2%B4%EB%B6%84_%EA%B2%BD%EA%B8%B0%EB%8F%84.zip"                                    
 [3] "/data/map/구역의도형/202409/%EA%B5%AC%EC%97%AD%EC%9D%98%EB%8F%84%ED%98%95_%EC%A0%84%EC%B2%B4%EB%B6%84_%EA%B2%BD%EC%83%81%EB%82%A8%EB%8F%84.zip"                           

이제 이 파일명을 사람이 읽을 수 있는 형태로 변환해야 한다. 보통 tibble 형태로 작업하는 걸 좋아해서, tibble 형태로 먼저 변환했다. 그리고 map_chr 함수를 이용하여 파일 경로들을 URLdecode 처리한다. 이렇게 하면 인코딩된 한글이 원래 한글로 복원된다.

list.files('~/data/map/구역의도형/202409', full.names = T) |> 
  enframe(name = NULL) |> 
  mutate(value2 = map_chr(value, URLdecode), .before = value) |> 
  select(value2)

# A tibble: 17 × 1
   value2
   <chr>     
 1 /data/map/구역의도형/202409/구역의도형_전체분_강원특별자치도.zip
 2 /data/map/구역의도형/202409/구역의도형_전체분_경기도.zip        
 3 /data/map/구역의도형/202409/구역의도형_전체분_경상남도.zip  

마지막으로 파일명을 살짝 수정하고, 수정된 이름으로 파일을 복사한다.

fs = list.files('~/data/map/구역의도형/202409', full.names = T) |> 
  enframe(name = NULL) |> 
  mutate(value2 = map_chr(value, URLdecode), .before = value) |> 
  mutate(value2 = str_replace(value2, '구역의도형_전체분_', ''))

purrr::map2_lgl(fs$value, fs$value2, file.copy, copy.date = T)

결과로는 아래 그림처럼 제대로 변환된 것을 볼 수 있다.

r 

더 보면 좋을 글들