Skip to content

Konwerter kodowania i naprawa krzaków

Wklej krzaki i odzyskaj oryginalny tekst. Narzędzie sprawdza wszystkie łańcuchy kodowań — UTF-8, GBK, Big5, Shift_JIS, EUC-KR, Windows-1252 — porządkuje wyniki i pokazuje dokładny łańcuch. Za darmo, lokalnie w przeglądarce.

Bez śledzenia Działa w przeglądarce Bezpłatne
Wszystko dekoduje się lokalnie w przeglądarce — wklejony tekst nie opuszcza tego urządzenia.

Odzyskaj zniekształcony tekst

Wklej krzaki. Narzędzie sprawdza każdy sensowny łańcuch kodowań i porządkuje wyniki — nie trzeba wiedzieć, które kodowanie zawiniło.

Wypróbuj

Najbardziej prawdopodobne oryginały

Kandydaci: 4
  1. 测试

    Dokładny

    UTF-8 → GBK

  2. 娴嬭瘯

    Dokładny

    Windows-1252 / Latin-1 → UTF-8

  3. 测试

    Dokładny

    Windows-1252 / Latin-1 → GBK

  4. 测试

    Dokładny

    Windows-1251 → GBK

Konwertuj i podejrzyj kodowania

Zobacz ten sam tekst naraz jako bajty w każdym popularnym kodowaniu — przydaje się, gdy trzeba dokładnie wiedzieć, co zapisze baza albo protokół.

Kodowanie Bajty Hex
UTF-8 6 E4 B8 AD E6 96 87
GBK 4 D6 D0 CE C4
GB18030 4 D6 D0 CE C4
Big5 4 A4 A4 A4 E5
Shift_JIS 4 92 86 95 B6
EUC-KR 4 F1 E9 D9 FE

Każdy łańcuch kodowań pokazany na tej stronie pochodzi z tego samego silnika, który napędza stronę, a sprawdzenie konwersji w obie strony stojące za plakietką „Dokładny” jest asertowane w zestawie testów jednostkowych na znanych sekwencjach bajtów. — Go Tools Team · Sep 8, 2026

Zbudowane i zweryfikowane przez zespół inżynierski Go Tools.

Szybkie odpowiedzi

Jakie kodowanie zamienia 测试 w 娴嬭瘯?

UTF-8 → GBK Bajty UTF-8 odczytane jako GBK. Sześć bajtów UTF-8 (E6 B5 8B E8 AF 95) zostaje przegrupowane w trzy znaki GBK.

Co zamienia ą, ł i ę w ą, Å‚ i Ä™?

UTF-8 → Windows-1252 Te same bajty UTF-8 odczytane jako Windows-1252. To kodowanie jest jednobajtowe, więc każdy bajt staje się osobnym znakiem.

Czy tekst zawierający � da się odzyskać?

Nie do odzyskania Nie. Te bajty zostały odrzucone przy dekodowaniu. Odzyskaj, co się da, z otaczającego tekstu, a resztę weź ze źródła.

Ile bajtów zajmuje znak chiński?

3 kontra 2 bajty Trzy w UTF-8, dwa w GBK i Big5. Ta różnica jest częstym źródłem obcięcia, gdy długość kolumny liczy się w bajtach, a nie w znakach.

Czym jest mojibake?

Mojibake, po polsku po prostu krzaki, powstaje wtedy, gdy tekst zapisano w jednym kodowaniu znaków, a odczytano w innym. Bajty pozostają nienaruszone; błędna jest wyłącznie interpretacja. Właśnie na tym rozróżnieniu opiera się możliwość odzyskania treści: jeżeli uda się ustalić, które kodowanie zapisało bajty i które je błędnie odczytało, pomyłkę można odtworzyć od tyłu i wrócić do oryginału.

Samo słowo jest japońskie — 文字化け, mniej więcej „przemiana znaków” — i przyjęło się w angielszczyźnie, bo problem był powszechny w japońskiej informatyce na długo przed Unicode. Tekst chiński, japoński i koreański cierpi na to znacznie bardziej niż tekst łaciński, i to z powodu strukturalnego: te języki wymagają kodowań wielobajtowych, a kodowania wielobajtowe nie zgadzają się co do tego, jak grupować bajty. Ciąg zapisany alfabetem łacińskim to zwykle czyste ASCII, a co do ASCII zgadzają się wszystkie kodowania. Polski leży pośrodku: bez ą, ć, ę, ł, ń, ó, ś, ź i ż zdanie przechodzi przez każdą pomyłkę bez szwanku, ale każda z tych dziewięciu liter zajmuje w UTF-8 dwa bajty i to one rozjeżdżają się jako pierwsze.

Odzyskiwanie zawodzi w dokładnie jednej sytuacji. Kiedy dekoder napotyka bajty pozbawione znaczenia w jego kodowaniu, nie zachowuje ich — wstawia U+FFFD i wyrzuca je. Te znaki są stracone na stałe. Cała reszta jest odwracalna.

// The mistake, in three lines of JavaScript
const bytes = new TextEncoder().encode('测试');   // UTF-8: E6 B5 8B E8 AF 95
new TextDecoder('gbk').decode(bytes);            // '娴嬭瘯'  ← mojibake
new TextDecoder('windows-1252').decode(bytes);   // '测试'  ← same bytes, other mistake

Co robi to narzędzie

Nie trzeba znać kodowania

Wklej krzaki, a narzędzie samo wyliczy łańcuchy. Sprawdzana jest każda kombinacja „zapisano jako” i „odczytano jako” w obrębie UTF-8, GBK, GB18030, Big5, Shift_JIS, EUC-KR, Windows-1252 i Windows-1251.

Dokładne wyniki są zweryfikowane, a nie zgadnięte

Kandydat dostaje plakietkę „Dokładny” tylko wtedy, gdy przepuszczenie go z powrotem przez ten sam łańcuch odtwarza wejście znak w znak. To sprawdzenie deterministyczne — uszeregowana hipoteza nie powiedziałaby, którym wynikom można zaufać.

Łańcuch jest pokazany, a nie schowany

Każdy kandydat nazywa kodowanie, które bajty zapisało, i to, które je błędnie odczytało. Dopiero to pozwala naprawić źródło, zamiast reperować te same ciągi znowu za tydzień.

Uczciwość wobec tekstu nie do odzyskania

Jeżeli wejście zawiera już znaki zastępcze, narzędzie mówi o tym wprost i oznacza każdego kandydata jako częściowego. Informacja zniszczona przy dekodowaniu nie wraca, a udawanie, że jest inaczej, kosztuje całe popołudnie.

Podgląd bajtów naraz we wszystkich kodowaniach

Zobacz dowolny tekst jako bajty szesnastkowe obok siebie we wszystkich obsługiwanych kodowaniach i zdekoduj surowy hex w drugą stronę. Przydaje się przy dobieraniu długości kolumn, czytaniu przechwyconego ruchu i sprawdzaniu zawartości pól BLOB.

Nic nie opuszcza przeglądarki

Dekodowanie korzysta z wbudowanego w przeglądarkę TextDecoder. Nie ma wysyłki, nie ma zapisu, nie ma przepisywania adresu URL — a to ma znaczenie, bo krzaki przychodzą zwykle prosto z produkcji.

Przykłady krok po kroku

UTF-8 odczytany jako GBK — klasyka gatunku

娴嬭瘯
测试

Dwa chińskie znaki zapisano poprawnie w UTF-8 (bajty E6 B5 8B E8 AF 95), po czym program odczytał te sześć bajtów jako GBK. GBK grupuje bajty po dwa, więc zamiast dwóch znaków wyszły trzy. Tak wygląda otwarcie pliku UTF-8 w starej aplikacji windowsowej albo połączenie z bazą, w którym charset ustawiono na gbk, podczas gdy dane są w UTF-8.

UTF-8 odczytany jako Windows-1252 — wariant zachodni

测试
测试

Te same bajty, inna pomyłka. Windows-1252 jest jednobajtowy, więc każdy z sześciu bajtów UTF-8 stał się osobnym znakiem. Języki zapisywane alfabetem łacińskim obrywają dokładnie w ten sposób: café zamienia się w café, a polskie ą, ł i ę w ą, Å‚ i Ä™. Znakiem rozpoznawczym są Ã, Â, Å i â oraz znaki interpunkcyjne pojawiające się parami.

Bajty, które masz już w postaci szesnastkowej

B2 E2 CA D4
测试

Czasem nie patrzysz na krzaki, tylko na zrzut hex z przechwyconego ruchu sieciowego albo z kolumny BLOB. Wklej hex w drugiej sekcji i wskaż kodowanie. B2 E2 CA D4 to 测试 w GBK — te same dwa znaki zajmują sześć bajtów w UTF-8 (E6 B5 8B E8 AF 95), a w Windows-1252 nie da się ich zapisać wcale.

Tekst, którego nie da się odzyskać

鏁版嵁搴�
(tylko częściowo)

数据库 zapisano w UTF-8, a odczytano jako GBK, ale ostatnia para bajtów nie miała w GBK żadnego znaczenia, więc dekoder zastąpił ją znakiem � (U+FFFD). Ten bajt przepadł. Narzędzie to sygnalizuje, zamiast po cichu zgadywać — 数据 z początku ciągu wciąż da się odzyskać, ale ostatniego znaku już nie i trzeba wrócić do danych źródłowych.

Jak korzystać z narzędzia

  1. 1

    Wklej zniekształcony tekst

    Po prostu wrzuć go do pola — bez wcześniejszego ustalania kodowania. Wystarczy krótki fragment; kilkanaście znaków zwykle jednoznacznie wskazuje łańcuch.

  2. 2

    Przeczytaj pierwszego kandydata i jego plakietkę

    „Dokładny” znaczy, że łańcuch odtwarza wejście co do znaku. „Częściowy” znaczy, że nie odtwarza — wtedy wynik jest tylko tropem.

  3. 3

    Sprawdź łańcuch kodowań

    Każdy kandydat pokazuje, w jakim kodowaniu tekst naprawdę zapisano i które go błędnie odczytało. To mówi, co naprawić u źródła, a nie tylko co było w treści.

  4. 4

    W razie potrzeby zajrzyj w bajty

    Druga sekcja pokazuje dowolny tekst jako bajty w każdym popularnym kodowaniu i dekoduje surowy hex w drugą stronę. Przydaje się przy dobieraniu długości kolumn i sprawdzaniu ramek protokołu.

Błędy, które pogarszają sprawę

Konwertowanie tekstu, który wcale nie był zepsuty

Jeżeli ciąg wyświetla się poprawnie, a mimo to zostanie przekonwertowany, powstają dokładnie te krzaki, których miało się uniknąć. Najpierw sprawdź, jak tekst wygląda, i pamiętaj, że brakująca czcionka renderuje się jako kwadraciki (□□□), a problem z kodowaniem jako niewłaściwe znaki.

✗ Niepoprawne
iconv -f UTF-8 -t GBK correct.txt > broken.txt
✓ Poprawne
# Najpierw potwierdź bieżące kodowanie
file -I correct.txt   # charset=utf-8 → nie ma czego konwertować

Deklarowanie charsetu, którego dane nie mają

Zmiana zadeklarowanego charsetu kolumny MySQL nie przekodowuje trzymanych w niej bajtów. Zadeklarowanie danych latin1 jako utf8 sprawia, że serwer oddaje bajty, które nie są poprawnym UTF-8, a sterownik zastępuje je znakiem U+FFFD — czyli je niszczy.

✗ Niepoprawne
ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4;
✓ Poprawne
-- Przejdź przez typ binarny, żeby bajty zostały zachowane, a nie zinterpretowane na nowo
ALTER TABLE t MODIFY c VARBINARY(255);
ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4;

Zaufanie częściowemu odzyskaniu

Kandydat oznaczony jako „Częściowy” nie domknął konwersji w obie strony. To trop wart sprawdzenia, a nie odpowiedź do wklejenia z powrotem do bazy. Jeżeli nic nie wraca jako dokładne, wejście najprawdopodobniej już straciło informację — trzeba wrócić do bajtów źródłowych.

✗ Niepoprawne
// Bierze pierwszego kandydata niezależnie od plakietki
db.update(row.id, candidates[0].text);
✓ Poprawne
// Zapisuj tylko to, co domyka konwersję w obie strony
if (candidates[0].lossless) db.update(row.id, candidates[0].text);

Zakładanie, że nawyki z Pythona 2 wciąż obowiązują

Wywołanie encode na czymś, co już jest bajtami, albo decode na czymś, co już jest ciągiem znaków, w Pythonie 3 rzuca wyjątek, zamiast po cichu robić rundę przez ASCII. Zdekoduj bajty raz, na granicy systemu, i dalej trzymaj tekst jako tekst.

✗ Niepoprawne
text = raw.decode('utf-8').encode('gbk').decode('utf-8')
✓ Poprawne
# Zdekoduj raz, na granicy, kodowaniem, którego plik faktycznie używa
with open(path, encoding='gbk') as f:
    text = f.read()

Kiedy się przydaje

Migracja bazy danych wyprodukowała krzaki
Stare tabele MySQL zadeklarowane jako latin1, a trzymające faktycznie bajty UTF-8, to zdecydowanie najczęstsze źródło problemu. Wklej tutaj zniekształcony wiersz i potwierdź prawdziwy łańcuch, zanim napiszesz ALTER TABLE — konwersja w złą stronę zamienia problem odwracalny w trwały.
Plik CSV otwarty w Excelu pokazuje bzdury
Excel na Windows nadal zakłada systemową stronę kodową dla plików CSV bez BOM, więc eksport w UTF-8 wychodzi jako krzaki, a polskie nazwiska rozsypują się pierwsze. Potwierdź łańcuch tutaj, a potem wyeksportuj ponownie z BOM albo zaimportuj kreatorem tekstu z jawnie ustawionym kodowaniem.
Logi ze starej usługi
Aplikacje pisane pod GBK albo Shift_JIS zapisują logi w tych kodowaniach, a nowoczesne agregatory czytają wszystko jako UTF-8. Wklej wiersz, żeby go odzyskać — a ponieważ nic nie jest wysyłane, można to robić na logach produkcyjnych.
Nazwy plików zepsute przez archiwum ZIP
Format ZIP nie ma pola na kodowanie, więc archiwa tworzone na chińskim czy japońskim Windowsie niosą nazwy plików w GBK albo Shift_JIS, które narzędzia uniksowe czytają jako UTF-8. Odzyskaj prawdziwe nazwy tutaj, zanim cokolwiek zmienisz.
Dobieranie długości kolumny w bazie
Podgląd bajtów pokazuje ten sam tekst naraz we wszystkich kodowaniach. Znak chiński to 3 bajty w UTF-8, ale 2 w GBK, a polskie ż zajmuje 2 bajty zamiast jednego — dokładnie takie różnice zamieniają VARCHAR(50) w błąd obcięcia.

Skąd biorą się krzaki

Bajty przeżywają, znaczenie nie
Kodowanie odwzorowuje znaki na bajty, dekodowanie prowadzi z powrotem. Mojibake to dekodowanie z niewłaściwym odwzorowaniem. Bajty nigdy nie zostały uszkodzone i dlatego odtworzenie błędnego dekodowania od tyłu zwraca oryginał co do znaku — o ile to błędne dekodowanie niczego nie odrzuciło.
Dlaczego najbardziej obrywa tekst CJK
ASCII zajmuje 0x00–0x7F i wszystkie popularne kodowania zgadzają się co do niego, więc tekst angielski przechodzi bez szwanku. Chiński, japoński i koreański wymagają sekwencji wielobajtowych, a kodowania nie zgadzają się co do ich grupowania. UTF-8 używa trzech bajtów na znak chiński, GBK dwóch. Podaj bajty UTF-8 dekoderowi GBK, a grupowanie się przesunie i wyjdzie inna liczba innych znaków.
Test konwersji w obie strony
Dla każdego łańcucha kandydata narzędzie koduje odzyskany tekst pierwszym kodowaniem i dekoduje drugim. Jeżeli odtworzy to wejście dokładnie, łańcuch tłumaczy każdy znak i kandydat dostaje plakietkę „Dokładny”. Kandydaci, którzy testu nie przechodzą, i tak są pokazywani, bo częściowe odzyskanie często wystarcza do rozpoznania treści, nawet gdy nie potrafi jej odtworzyć.
Skąd biorą się tablice kodowań
Tablice dostarcza TextDecoder przeglądarki. Kodowanie w drugą stronę jest trudniejsze, bo TextEncoder obsługuje wyłącznie UTF-8 — narzędzie buduje więc odwrotne odwzorowanie, przechodząc przestrzeń bajtów i pytając dekoder, co znaczy każda sekwencja. Dzięki temu odwzorowanie zawsze zgadza się z zachowaniem samej przeglądarki i na urządzenie nie trafiają żadne tablice.
Heurystyka porządkowania i jej granice
Poza testem konwersji w obie strony kandydaci są punktowani według tego, jaka część tekstu to częste znaki chińskie (te, których wiodący bajt GBK mieści się w 0xB0–0xF7), minus kary za znaki zastępcze, katakanę półszerokościową i znaki sterujące. Katakana półszerokościowa jest mocnym sygnałem Shift_JIS, bo normalny tekst japoński prawie jej nie używa. To heurystyka: rozstrzyga remisy, nie ustala prawdy.

Jak nie dopuścić do powtórki

Napraw źródło, a nie sam ciąg znaków
Łańcuch kodowań wypisany pod każdym kandydatem wskazuje, który element jest źle skonfigurowany. Naprawa samego tekstu bez poprawienia charsetu połączenia, czytnika plików albo ustawień eksportu oznacza powtórkę jutro, na świeżych danych.
Potwierdź kierunek, zanim przekonwertujesz cały plik
Najpierw przepuść przez tę stronę reprezentatywny wiersz. Konwersja w złą stronę potrafi wyprodukować znaki zastępcze, a ten krok — w odróżnieniu od pierwotnej pomyłki — jest nieodwracalny.
Ustawiaj kodowanie jawnie wszędzie
Charset połączenia z bazą, nagłówek HTTP Content-Type, wywołania otwierające pliki, eksport CSV. Każde miejsce, które domyślnie bierze „kodowanie systemowe”, to miejsce, w którym ten sam błąd wróci po przeniesieniu kodu na inną maszynę.
W MySQL wybieraj utf8mb4 zamiast utf8
utf8 w MySQL przechowuje najwyżej trzy bajty na znak, więc emoji i część rzadszych znaków chińskich są po cichu obcinane. utf8mb4 to prawdziwe UTF-8. To inna awaria niż mojibake i narzędzie do odzyskiwania tu nie pomoże, bo bajtów naprawdę już nie ma.
Trzymaj oryginalne bajty, dopóki poprawka nie jest zweryfikowana
Zrób kopię przed jakąkolwiek konwersją. Dopóki oryginalne bajty istnieją, każde błędne dekodowanie jest odwracalne — gdy raz zostaną nadpisane znakami zastępczymi, nie przywróci ich żadne narzędzie, ani z tej strony, ani z żadnej innej.

Najczęstsze pytania

Jak naprawić tekst, który wyświetla się jako krzaki?
Wklej zniekształcony tekst w pole na górze strony. Narzędzie sprawdza każdy sensowny łańcuch kodowań i porządkuje wyniki, więc nie trzeba samodzielnie rozpoznawać kodowania. W przytłaczającej większości przypadków odpowiedzią jest UTF-8 odczytany jako Windows-1252 — wtedy ą, ł i ę wyglądają jak ą, Å‚ i Ä™ — albo UTF-8 odczytany jako GBK, gdzie widać znaki w rodzaju 娴嬭瘯. Oba przypadki odzyskują się dokładnie.
Co dokładnie weryfikuje plakietka „Dokładny”?
Odzyskiwanie puszczone od tyłu. Odzyskany tekst zostaje ponownie zakodowany pierwszym kodowaniem z łańcucha, a powstałe bajty ponownie zdekodowane drugim. Jeżeli wynik odtwarza wejście znak w znak, łańcuch w pełni tłumaczy to, co zostało wklejone, i plakietka pokazuje „Dokładny”. To deterministyczne sprawdzenie konwersji w obie strony, a nie ocena podobieństwa — i dlatego takiemu wynikowi można ufać zupełnie inaczej niż uszeregowanej hipotezie.
Dlaczego części krzaków nie da się odzyskać nigdy?
Ponieważ szkoda powstała, zanim tekst w ogóle trafił na ekran. Kiedy dekoder napotyka ciąg bajtów bez znaczenia w swoim kodowaniu, nie zachowuje go — wstawia w to miejsce U+FFFD (wyświetlane jako �) i odrzuca bajty. Ta operacja jest stratna i nieodwracalna. Jeżeli w tekście widać �, te konkretne znaki przepadły niezależnie od użytego narzędzia. Ta strona mówi o tym wprost, zamiast produkować pewnie wyglądające zgadywanie.
Czym różnią się GBK, GB2312 i GB18030?
To trzy pokolenia tej samej rodziny, każde nadzbiorem poprzedniego. GB2312 (1980) obejmuje 6763 uproszczone znaki chińskie, co wystarcza do codziennego tekstu. GBK (1995) rozszerza to do mniej więcej 21 000 znaków, razem z formami tradycyjnymi. GB18030 (2000, obowiązkowe w Chinach) pokrywa cały Unicode. Do odzyskiwania krzaków niemal zawsze właściwym wyborem jest GBK, bo oprogramowanie, które problem wywołało, pisano zwykle pod GBK.
Czy ISO-8859-1 to to samo co Windows-1252?
W standardach nie, ale w każdej przeglądarce tak. Standard WHATWG Encoding — czyli to, co przeglądarki faktycznie implementują — traktuje iso-8859-1 oraz latin1 jako etykiety kodowania windows-1252. Różnica dotyczy wyłącznie zakresu 0x80–0x9F, gdzie prawdziwe ISO-8859-1 ma znaki sterujące, a Windows-1252 znaki drukowalne, takie jak pauza czy cudzysłowy typograficzne. Ponieważ to właśnie te drukowalne znaki wyskakują w krzakach, Windows-1252 jest tu użyteczniejsze i narzędzie wymienia je raz, pod obiema nazwami. Uwaga dla polskich danych: ISO-8859-2 i Windows-1250 to inna, środkowoeuropejska rodzina i nie ma ich na liście tego narzędzia — obsługiwane są UTF-8, GBK, GB18030, Big5, Shift_JIS, EUC-KR, Windows-1252 i Windows-1251. Najczęstszy polski przypadek, czyli UTF-8 odczytany jako Windows-1252, mieści się w tej liście.
Czy wklejony tekst gdzieś trafia?
Nie. Całe dekodowanie odbywa się w przeglądarce, przy użyciu wbudowanego TextDecoder, i nic nie idzie do sieci, nie ląduje w pamięci lokalnej ani nie trafia do adresu URL. Tutaj waży to więcej niż zwykle: krzaki niemal zawsze pochodzą z logu produkcyjnego, rekordu klienta albo zrzutu bazy, a to dokładnie te rzeczy, których nie wolno wklejać do narzędzia liczącego po stronie serwera.
Czy da się przekonwertować cały plik, a nie tylko fragment?
Ta strona obsługuje tekst wklejony do pola. Do całych plików służy wiersz poleceń: iconv -f GBK -t UTF-8 input.txt > output.txt na macOS i Linuksie albo Get-Content -Encoding Default in.txt | Set-Content -Encoding UTF8 out.txt w PowerShellu. Warto najpierw przepuścić tutaj reprezentatywny wiersz, żeby ustalić, jakie kodowania wpisać w polecenie — pomylenie kierunku na całym pliku to sposób, w jaki problem z jednej linijki zamienia się w problem z tysiąca.
Dlaczego narzędzie pokazuje kilku kandydatów zamiast jednej odpowiedzi?
Ponieważ czytelny tekst potrafi wyprodukować więcej niż jeden łańcuch, a narzędzie tego nie ukrywa. Kandydaci są sortowani tak, że najpierw idą łańcuchy wewnętrznie spójne (Dokładny), a potem decyduje heurystyka czytelności, która premiuje częste znaki chińskie, a karze znaki zastępcze, katakanę półszerokościową i znaki sterujące. Heurystyka rozstrzyga remisy, nie orzeka prawdy. Kiedy dwa wyniki wyglądają równie sensownie, o wyborze decyduje łańcuch kodowań wypisany pod każdym z nich — ten, który pasuje do rzeczywistego pochodzenia danych.

Powiązane narzędzia

Zobacz wszystkie narzędzia →