Słownik metodologiczny · Przygotowanie danych

Kodowanie znaków UTF-8 w danych – skąd „krzaczki” i jak ich uniknąć

UTF-8 zapisuje polskie litery dwoma bajtami. Gdy program odczyta plik w innym kodowaniu, „ó” zamienia się w „Ăł”. Pokazujemy, jak to rozpoznać i jak wczytać dane poprawnie w R.

Strona główna / Słownik / Kodowanie UTF-8
W skrócie: UTF-8 to kodowanie znaków Unicode, w którym znak zajmuje od 1 do 4 bajtów; polskie litery zajmują po dwa. Plik tekstowy nie zapisuje swojego kodowania, więc przy imporcie podaj je wprost, np. fileEncoding = "UTF-8" w R, i sprawdź polskie znaki zaraz po wczytaniu.

Co to jest kodowanie UTF-8?

UTF-8 to sposób zapisu znaków Unicode w bajtach (ang. character encoding, kodowanie znaków), w którym jeden znak zajmuje od 1 do 4 bajtów (Yergeau, 2003). Znaki z zestawu ASCII, czyli litery bez ogonków, cyfry i interpunkcja, mają ten sam jednobajtowy kod co w ASCII. Polskie litery zajmują po dwa bajty. Nie myl tego z kodowaniem zmiennych, czyli nadawaniem odpowiedziom liczb lub etykiet.

Skąd się biorą „krzaczki”?

Plik tekstowy, np. plik CSV, nie zawiera informacji o tym, jak go zakodowano. Program, który go otwiera, musi to wiedzieć albo zgadywać, a kodowania 8-bitowego nie da się wykryć automatycznie z pewnością (R Core Team, 2026). Jeśli plik zapisano w UTF-8, a program czyta go jako Windows-1250 (starsze kodowanie polskiego Windowsa), polskie litery zamieniają się w pary obcych znaków. Odwrotna pomyłka daje bajty, których nie da się odczytać jako tekstu.

Przykład

Zdanie „Zażółć gęślą jaźń” ma 17 znaków, ale w UTF-8 zajmuje 26 bajtów, bo każda z 9 polskich liter to 2 bajty. W zapisie szesnastkowym litera „a” to bajt 61, a „ó” – para bajtów C3 B3. Gdy plik UTF-8 z nazwami miast wczytamy jako Windows-1250, „Kraków” zmienia się w „KrakĂłw”, a „Gdańsk” w „GdaĹ„sk”. W pliku zapisanym w Windows-1250 funkcja validUTF8() odrzuciła oba wiersze z polskimi literami. Po podaniu właściwego kodowania obie nazwy wczytały się poprawnie.

Jak tego uniknąć

  • Zapisuj dane i skrypty w UTF-8 i wybieraj tę opcję przy eksporcie, jeśli program ją oferuje.
  • W R podawaj kodowanie wprost: read.csv("dane.csv", fileEncoding = "UTF-8"). Poprawna nazwa to „UTF-8”, a nie „utf8”.
  • Zaraz po imporcie obejrzyj kilka rekordów z polskimi znakami, zanim zaczniesz czyścić dane.
  • Znacznik BOM w UTF-8 to zawsze bajty EF BB BF na początku pliku; nie jest potrzebny, ale część programów go dopisuje (Yergeau, 2003). Jeśli nazwa pierwszej kolumny ma dziwny przedrostek, użyj fileEncoding = "UTF-8-BOM".

Jak opisać w pracy

Odpowiedzi wyeksportowano z formularza online do pliku CSV w kodowaniu UTF-8 i wczytano do programu R z jawnie podanym kodowaniem (fileEncoding = "UTF-8"). Po imporcie sprawdzono poprawność polskich znaków w odpowiedziach otwartych.

Na co uważać

Nie poprawiaj „krzaczków” ręcznie, tylko wczytaj plik jeszcze raz z właściwym kodowaniem. Podręcznik R przestrzega też, że nie każdy program sam rozpozna plik UTF-8, więc przed przekazaniem danych sprawdź, w czym odbiorca je otworzy. Drogę od formularza do analizy pokazuje wpis Dane z Google Forms i LimeSurvey.

Przykład reprodukowalny

Kodowanie znaków w R

Kod liczy znaki i bajty w polskim zdaniu, pokazuje bajty dwóch liter i wczytuje ten sam plik CSV z błędnym i z poprawnym kodowaniem.

Plik UTF-8 odczytany jako Windows-1250 i odwrotnie

Dane wejściowe: dwie nazwy miast z polskimi literami zapisane do plików tymczasowych w UTF-8 i w Windows-1250 (dane przykładowe).

Co odczytać: liczbę znaków i bajtów, bajty liter „a” i „ó”, nazwy miast po błędnym i poprawnym odczycie oraz wynik validUTF8() dla nagłówka i dwóch wierszy.

R
x <- "Zażółć gęślą jaźń"                                  # 9 polskich liter
c(znaki = nchar(x), bajty = nchar(x, type = "bytes"))
charToRaw("a"); charToRaw("ó")                             # 1 bajt w ASCII, 2 bajty dla „ó”
dane <- data.frame(id = 1:2, miasto = c("Kraków", "Gdańsk"))
utf <- tempfile(fileext = ".csv")
write.csv(dane, utf, row.names = FALSE, fileEncoding = "UTF-8")
read.csv(utf, fileEncoding = "CP1250")$miasto              # plik UTF-8 odczytany jako Windows-1250
read.csv(utf, fileEncoding = "UTF-8")$miasto               # poprawne kodowanie
cp <- tempfile(fileext = ".csv")
write.csv(dane, cp, row.names = FALSE, fileEncoding = "CP1250")
validUTF8(readLines(cp))                                   # nagłówek i dwa wiersze danych
read.csv(cp, fileEncoding = "CP1250")$miasto
Wynik w R
znaki bajty 
   17    26 
[1] 61
[1] c3 b3
[1] "Kraków" "Gdańsk"
[1] "Kraków" "Gdańsk"
[1]  TRUE FALSE FALSE
[1] "Kraków" "Gdańsk"

Bibliografia oprogramowania

Wyniki pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (funkcje pakietów base i utils).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/

Najczęstsze pytania

Jak naprawić polskie znaki po wczytaniu pliku CSV do R?

Nie poprawiaj znaków ręcznie. Wczytaj plik jeszcze raz z właściwym argumentem fileEncoding, zwykle "UTF-8", a dla starszych plików z Windows "CP1250". Potem obejrzyj kilka rekordów z polskimi literami.

Czym różni się UTF-8 od Windows-1250?

Windows-1250 zapisuje każdy znak jednym bajtem i obejmuje tylko alfabety środkowoeuropejskie. UTF-8 obejmuje cały Unicode, a polskie litery zapisuje dwoma bajtami, więc te same bajty znaczą w obu kodowaniach co innego.

Czy plik w UTF-8 musi mieć znacznik BOM?

Nie. W UTF-8 BOM to zawsze bajty EF BB BF i nie jest potrzebny (Yergeau, 2003). Część programów go dopisuje; gdy w R psuje nazwę pierwszej kolumny, użyj fileEncoding = "UTF-8-BOM".

Powiązane hasła

Poradniki, w których użyjesz tego pojęcia

Potrzebujesz wsparcia w analizie danych?

Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.

Wyceń analizęOferta dla studentów

Bibliografia i dalsza literatura naukowa (APA 7)

  1. R Core Team. (2026). R data import/export (Version 4.6.1). R Foundation for Statistical Computing. https://cran.r-project.org/doc/manuals/r-release/R-data.html ● Otwarty dostęp
  2. Yergeau, F. (2003). UTF-8, a transformation format of ISO 10646 (RFC 3629). RFC Editor. https://doi.org/10.17487/rfc3629 ● Otwarty dostęp: pełny tekst

Cytowania BibTeX

@techreport{rcoreteam2026rdata, author={{R Core Team}}, title={{R data import/export}}, year={2026}, institution={R Foundation for Statistical Computing}, url={https://cran.r-project.org/doc/manuals/r-release/R-data.html}}
@techreport{yergeau2003utf8, author={Yergeau, Fran\c{c}ois}, title={{UTF-8, a transformation format of ISO 10646}}, year={2003}, institution={RFC Editor}, doi={10.17487/rfc3629}}
R