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.
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.
Wklej krzaki. Narzędzie sprawdza każdy sensowny łańcuch kodowań i porządkuje wyniki — nie trzeba wiedzieć, które kodowanie zawiniło.
测试
UTF-8 → GBK
娴å¬ç˜¯
Windows-1252 / Latin-1 → UTF-8
测试
Windows-1252 / Latin-1 → GBK
测试
Windows-1251 → GBK
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 |
Zbudowane i zweryfikowane przez zespół inżynierski Go Tools.
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.
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.
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.
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.
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 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.
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ć.
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ń.
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.
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.
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.
娴嬭瘯
测试
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.
测试
测试
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.
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.
鏁版嵁搴�
(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.
Po prostu wrzuć go do pola — bez wcześniejszego ustalania kodowania. Wystarczy krótki fragment; kilkanaście znaków zwykle jednoznacznie wskazuje łańcuch.
„Dokładny” znaczy, że łańcuch odtwarza wejście co do znaku. „Częściowy” znaczy, że nie odtwarza — wtedy wynik jest tylko tropem.
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.
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.
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.
iconv -f UTF-8 -t GBK correct.txt > broken.txt
# Najpierw potwierdź bieżące kodowanie file -I correct.txt # charset=utf-8 → nie ma czego konwertować
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.
ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4;
-- 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;
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.
// Bierze pierwszego kandydata niezależnie od plakietki db.update(row.id, candidates[0].text);
// Zapisuj tylko to, co domyka konwersję w obie strony if (candidates[0].lossless) db.update(row.id, candidates[0].text);
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.
text = raw.decode('utf-8').encode('gbk').decode('utf-8') # Zdekoduj raz, na granicy, kodowaniem, którego plik faktycznie używa
with open(path, encoding='gbk') as f:
text = f.read() 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. Kodowanie i formatowanie
Pełna tablica ASCII: 128 znaków w systemie dziesiętnym, szesnastkowym, ósemkowym i dwójkowym oraz dwukierunkowy konwerter. Znaki sterujące z sekwencjami escape, notacją z daszkiem i miejscem, gdzie naprawdę się je spotyka.
Kodowanie i formatowanie
Zakoduj i zdekoduj Base64 online za darmo. Konwersja w czasie rzeczywistym z pełną obsługą UTF-8 i emoji. 100% w przeglądarce, bez rejestracji.
Kodowanie i formatowanie
Zdekoduj ciąg Base64 lub data URI z powrotem na obraz w przeglądarce. Podejrzyj, odczytaj wymiary i MIME, a potem pobierz jako PNG, JPG, GIF, SVG. Bez przesyłania.
Kodowanie i formatowanie
Konwertuj CSV na JSON w przeglądarce. RFC 4180, wnioskowanie typów, nagłówek, big-int safe. 100% prywatnie, bez wysyłki.
Kodowanie i formatowanie
Wklej plik .env i od razu otrzymaj JSON. Hasła, klucze API i tokeny nigdy nie opuszczają przeglądarki — 100% prywatnie, bez wysyłania, parser dotenv.
Kodowanie i formatowanie
Dekoduj encje HTML i unescape HTML online — za darmo, bez rejestracji, w 100% w przeglądarce. Zamienia odwołania nazwane, dziesiętne & szesnastkowe z powrotem na znaki; nic nie jest wysyłane.