Inspektor Unicode
Wklej tekst → tabela każdego code pointa. Hex, decimal, bajty UTF-8, kategoria. Wyłapuj niewidzialne znaki.
Do czego to służy?
"Dlaczego ten string nie porównuje się jako równy?" "Dlaczego ten username jest odrzucany jako już zajęty, choć wygląda na wolny?" "Dlaczego ta nazwa pliku łamie mi shell?" Odpowiedź prawie zawsze brzmi: bajty nie pasują do tego, co widzą oczy. Dwa znaki mogą wyglądać identycznie, ale być różnymi code pointami (łacińskie "a" vs cyryliczne "а"); whitespace może ukrywać non-breaking spaces, zero-width joinery albo right-to-left override'y; emoji może być jednym code pointem albo czterema. To narzędzie rozkłada dowolny tekst na poszczególne code pointy Unicode, z hex, decimal, sekwencją bajtów UTF-8, kategorią i nazwą, gdy znana.
Kiedy tego użyć
- Diagnoza buga "wygląda tak samo, ale nie jest równe".
- Znalezienie niewidzialnych znaków (zero-width space, BOM, override RTL) ukrytych w skopiowanym tekście.
- Liczenie bajtów vs code pointów vs jednostek UTF-16 przed zapisem do kolumny o stałej szerokości.
- Inspekcja emoji, żeby zobaczyć, której sekwencji ZWJ używa.
- Wyłapywanie ataków homoglyph w nazwach domen albo username'ach.
- Generowanie dokładnych sekwencji bajtów UTF-8 do hex dumpa.
Czytanie wyjścia
- Code point — abstrakcyjna wartość Unicode, zapisana
U+XXXX. Jest ich 1,1 mln; najwyższy w użyciu to U+10FFFF. - UTF-8 — jak ten code point jest kodowany w bajty w nowoczesnych plikach (1–4 bajty na znak).
- Jednostki UTF-16 — to, co liczą stringi JavaScriptu (
s.length) i stringi Javy. Code point powyżej U+FFFF (większość emoji) zajmuje dwie jednostki UTF-16 (parę surrogate'ów). - Kategoria — skrót ogólnej kategorii Unicode: L=letter, N=number, P=punctuation, S=symbol, Z=separator, C=control/format/private.
Częste pułapki
- Długość jest dwuznaczna. "👨👩👧" ma 1 grapheme cluster, 5 code pointów, 11 jednostek UTF-16 i 18 bajtów UTF-8 — to wszystko "długości", które coś może raportować.
- Sekwencje zero-width joiner vs sekwencje selektorów. Wiele emoji to sekwencje ZWJ: rodzina, profesja, warianty tonu skóry. Przestawienie albo wycięcie ZWJ zmienia to, co jest renderowane.
- Normalizacja ma znaczenie. "café" może być e+◌́ (NFD) albo é (NFC). Wyglądają identycznie, ale to różne bajty; bazy i kod porównujący muszą znormalizować do tej samej formy.
- Right-to-left override'y są niebezpieczne. Nazwa pliku zawierająca U+202E może odwrócić swoje wyświetlanie — sprawiając, że
resutxt.exewygląda jakresuexe.txtw eksploratorze plików. Używane w phishingu. - Kolumna nazw jest częściowa. Prawdziwa baza Unicode ma nazwy dla każdego code pointa; inspektor podaje nazwy tylko dla znaków sterujących i typowych znaków format/whitespace, gdzie nazwa jest najbardziej użyteczną diagnostyką.
- Połówki surrogate'ów nie powinny pojawiać się samodzielnie. Jeśli widzisz U+D800–U+DFFF w wyjściu, wejście to zniekształcony string UTF-16 (lone surrogate). Większość API odmówi zakodowania tego do UTF-8.