윈도우에서 문자열 인코딩 문제
윈도우에서 문자열의 인코딩 문제
움라우트(Umlaut)
UTF-8test.txt
에는 다음의 내용이 저장되어 있다.
"création d'un rôle",""ÿ"" "初演","重役" "초연",""중역"이라고"
<
문자열>
장에서 좀 더 자세히 살펴보겠지만, 쉼표로 구분되고, "
가 인용부호로 쓰인 데이터 화일로 생각할 수 있다. 이를 R의 기본 함수인 read.csv
, readr::read_csv
, data.table::fread
로 읽어보면 결과는 다음과 같다.
dat1 <- read.table('UTF-8test.txt',
sep=',',
fileEncoding='UTF-8',
stringsAsFactors=FALSE); dat1
dat2 <- readr::read_delim('UTF-8test.txt',
delim=',',
col_names=FALSE); dat2
dat3 <- data.table::fread('UTF-8test.txt',
sep=',',
header=FALSE,
encoding='UTF-8'); dat3
dat1 <- read.table('UTF-8test.txt',
sep=',',
fileEncoding='UTF-8',
stringsAsFactors=FALSE); dat1
## V1 V2 ## 1 creation d'un role y ## 2 初演 重役 ## 3 초연 중역이라고
비슷하지만 조금씩 다르다. read.table
로 읽은 dat1
의 경우 움라우트라고 부르는 알파벳 위의 점이 사라졌다. 그리고 "y"
의 큰 따옴표도 사라졌다.
dat2 <- readr::read_delim('UTF-8test.txt',
delim=',',
col_names=FALSE)
dat2
## Parsed with column specification:
## cols(
## X1 = col_character(),
## X2 = col_character(),
## X3 = col_character()
## )
## Warning in rbind(names(probs), probs_f): number of columns of result
## is not a multiple of vector length (arg 1)
## Warning: 5 parsing failures.
## row # A tibble: 5 x 5 col row col expected actual file expected
## ...
### A tibble: 2 x 3
## X1 X2 X3
## <chr> <chr> <chr>
##1 création d'un rôle "ÿ\"\r\n\"初演" 重役
##2 초연 "\"중역\"이라고" NA
read_delim
으로 읽은 dat2
에는 création d'un rôle
와 같이 움라우트는 정확하게 읽었지만, 열의 수가 3개로 인식되었으며 \r\n
와 같은 제어문자가 포함되어 있다.
dat3 <- data.table::fread('UTF-8test.txt',
sep=',',
header=FALSE,
encoding='UTF-8'); dat3
## Warning in data.table::fread("UTF-8test.txt", sep = ",", header = FALSE, : ## Found and resolved improper quoting in first 100 rows. If the fields are ## not quoted (e.g. field separator does not appear within any field), try ## quote="" to avoid this warning.
## V1 V2 ## 1: creation d'un role "y" ## 2: 初演 重役 ## 3: 초연 "중역"이라고
fread
로 읽은 dat3
의 출력 결과를 보면 data.table::fread
의 경우도 read.csv
와 같이 움라우트가 사라졌다. 이상의 결과는 윈도우 R에서 인코딩 문제의 일면을 보여준다.
보이는 것이 모두가 아니다.
화일을 읽어들일 때 몇 가지 주의할 점이 있다. 앞에서 read.csv
와 data.table::fread
의 경우 움라우트가 모두 사라진 것처럼 보인다. 하지만 보이는 것이 전부가 아니다!
dat1$V1
dat3$V1
## [1] "creation d'un role" "初演" "초연"
## [1] "création d'un rôle" "初演" "초연"
신기하게도 fread
의 경우는 데이터테이블의 한 열을 벡터로 출력하면 움라우트가 보존되어 있음을 확인할 수 있다. 다음은 동일한 자료를 데이터프레임, 티블로 변환하여 출력한 결과이다.
dat3df <- as.data.frame(dat3); dat3tb <- tibble::as_tibble(dat3)
print(dat3df); print(dat3df$V1)
## V1 V2
## 1 creation d'un role "y"
## 2 初演 重役
## 3 초연 "중역"이라고
## [1] "creation d'un role" "初演" "초연"
print(dat3tb); print(dat3tb$V1)
## # A tibble: 3 x 2
## V1 V2
## <chr> <chr>
## 1 création d'un rôle "\"ÿ\""
## 2 初演 重役
## 3 초연 "\"중역\"이라고"
## [1] "création d'un rôle" "初演" "초연"
벡터를 출력해보면 자료는 동일하다(움라우트가 보존되어 있다). 티블의 경우는 티블을 출력해도 움라우트가 보인다. 하지만 데이터프레임을 출력할 때에는 움라우트가 사라진 채 출력된다.
- 위의 글은 R로 하는 빅데이터 분석: 데이터 전처리와 시각화의 일부를 발췌, 각색한 것입니다.
Leave a comment