R 언어에서 stringi
는 문자열 처리를 위한 강력한 패키지 중 하나이다. 이 패키지는 다양한 문자열 연산을 수행하는데 사용되며, 유니코드 문자열, 정규표현식, 문자열 분할, 결합, 변환 등 다양한 기능을 제공한다. 그 중에 한글을 소리나는대로 알파벳으로 변환하는 기능을 알아보려 한다.
stri_trans_general
stri_trans_general
함수를 이용하면, 한글을 발음나는대로 영어로 변환할 수 있다. 아래는 사용 예시이다.
hangul_text = "안녕하세요"
latin_text = stri_trans_general(hangul_text, "Hangul-Latin")
# 출력결과
[1] "annyeonghaseyo"
이렇게 변환한 영어를 다시 한글로 재변환 할 수 있을까? 가능하다.
hangul_text = "닭고기"
(latin_text = stringi::stri_trans_general(hangul_text, "Hangul-Latin"))
[1] "dalg-gogi"
(hangul_text2 = stringi::stri_trans_general(latin_text, "Latin-Hangul"))
[1] "닭고기"
ICU
함수에서 사용되는 변환 규칙은 ICU (International Components for Unicode) 라이브러리를 사용하고 있다. ICU는 유니코드 문자열을 다루는 다양한 기능을 제공하여 국제화 및 지역화 (i18n) 작업을 보다 쉽게 만든다. 이 라이브러리는 C 및 C++로 작성되었으며, Java, Python, Ruby, PHP 등 다양한 프로그래밍 언어에서 사용할 수 있다.
마지막으로 약간 긴문장도 변환 및 복원이 잘되는지 실행해봤다.
> hangul_text1 = "오늘 날씨가 아주 맑았다. 그리고 아침에 일어나 간단하게 씨리얼과 사과 반쪽을 먹었다."
> (latin_text = stringi::stri_trans_general(hangul_text1, "Hangul-Latin"))
[1] "oneul nalssiga aju malg-assda. geuligo achim-e il-eona gandanhage ssilieolgwa sagwa banjjog-eul meog-eossda."
> (hangul_text2 = stringi::stri_trans_general(latin_text, "Latin-Hangul"))
[1] "오늘 날씨가 아주 맑았다. 그리고 아침에 일어나 간단하게 씨리얼과 사과 반쪽을 먹었다."
파일명 영문 변환
사실 이런 것보다도 파일명 한글인 것을 영어로 변환해야 할 필요가 있거나, 데이터 엑셀 헤더의 정보를 영어로 변환해서 데이터 분석하기에 조금 더 편한 방식으로 변환하여 사용중이다. 최근에 받은 파일들이 한글로 되어 있어서, 영문파일명으로 변환해야 했다.
list.files(path = '~/data/map/grid/from') |>
enframe(name = NULL) |>
mutate(value = map_chr(value, URLdecode), .before = value) |>
mutate(value = str_sub(value, 32))
# A tibble: 30 × 1
value
<chr>
1 grid_가다.zip
2 grid_가라.zip
3 grid_가사.zip
4 grid_가아.zip
5 grid_나나.zip
6 grid_나다.zip
7 grid_나라.zip
8 grid_나마.zip
9 grid_나바.zip
10 grid_나사.zip
# ℹ 20 more rows
# ℹ Use `print(n = ...)` to see more rows
아래처럼 stri_trans_general
함수를 이용해서 영문파일명으로 변환이 가능하기 때문에, 영문으로 파일명을 일괄 변경할 일이 있다면 사용해도 좋을 듯 하다.
list.files(path = '~/data/map/grid/from') |>
enframe(name = NULL) |>
mutate(value = map_chr(value, URLdecode), .before = value) |>
mutate(value = str_sub(value, 32)) |>
mutate(trans = map_chr(value, stringi::stri_trans_general, "Hangul-Latin"))
# A tibble: 30 × 2
value trans
<chr> <chr>
1 grid_가다.zip grid_gada.zip
2 grid_가라.zip grid_gala.zip
3 grid_가사.zip grid_gasa.zip
4 grid_가아.zip grid_gaa.zip
5 grid_나나.zip grid_nana.zip
6 grid_나다.zip grid_nada.zip
7 grid_나라.zip grid_nala.zip
8 grid_나마.zip grid_nama.zip
9 grid_나바.zip grid_naba.zip
10 grid_나사.zip grid_nasa.zip
# ℹ 20 more rows
# ℹ Use `print(n = ...)` to see more rows