Dlaczego kod AI się psuje, i jak naprawić prawdziwą przyczynę
Linter zgłasza błąd w linii, która wygląda bez zarzutu. Payload JSON nie przechodzi walidacji na polu identycznym ze schematem, ta sama długość, te same znaki. Błąd rzadko tkwi w logice. Siedzi między dwiema literami, niewidoczny, i trafił tam, bo kod wkleiłeś z okna czatu.
Tekst skopiowany z interfejsu czatu AI często niesie niewidoczne znaki Unicode, spacje zerowej szerokości, łączniki, spacje nierozdzielające, pozostałość po tym, jak interfejs wyświetla odpowiedź jako sformatowany HTML. To nie znak wodny i nikt nie umieścił ich tam celowo. Są też całkowicie niewidoczne w zwykłym edytorze, dlatego powodują błędy składni, zepsutą długość stringów i nieudane wywołania API, których nie da się wytłumaczyć. Wklej kod do weryfikatora poniżej, a każdy z nich się ujawni.
Więcej: co znaleziono, widok rentgenowski i opcje
Widok rentgenowski
Twój tekst z każdym ukrytym znakiem pokazanym jako etykieta. Najedź, aby zobaczyć nazwę Unicode.
Co znaleziono
| Punkt kodowy | Znak | Liczba | Działanie |
|---|
Czym naprawdę są te znaki
Zwykłe, standardowe punkty kodowe Unicode, nie złośliwy kod i nie celowa sygnatura. Mają realne zastosowania, tylko nie w nazwie zmiennej ani zapytaniu SQL.
| Znak | Punkt kodowy | Do czego służy | Co psuje w kodzie |
|---|---|---|---|
| Spacja zerowej szerokości | U+200B | Miejsce miękkiego łamania wiersza | Rozcina identyfikatory, psuje dopasowania regex |
| Łącznik zerowej szerokości | U+200D | Skleja sekwencje emoji | Zmienia długość stringa; .length kłamie |
| Łącznik wyrazów | U+2060 | Zapobiega złamaniu linii | Psuje tokeny porównywane lub haszowane |
| Spacja nierozdzielająca | U+00A0 | Trzyma liczbę przy jednostce | Wygląda jak spacja, nie jest nią; walidatory ją odrzucają |
Żaden z nich nie widać w zwykłym edytorze. To cały problem: code review, diff, własne oczy, nic tego nie złapie.
Gdzie to naprawdę boli
Linter pada na poprawnej linii
Zwykle spacja zerowej szerokości wewnątrz identyfikatora, dzieląca jeden token na dwa dla parsera.
Import CSV albo bazy danych psuje wiersz
Nieproszony znak zamienia czyste pole liczbowe w tekst albo przekracza limit długości, którego nikt nie ustawił celowo.
Wywołanie API zwraca 400 bez widocznej przyczyny
Surowe walidatory JSON nie wybaczają nieoczekiwanych punktów kodowych wewnątrz stringa, a treść żądania wygląda normalnie w każdym narzędziu.
To osobna sprawa niż realny statystyczny znak wodny, jaki w 2026 zaczęli wdrażać Claude i Gemini. Ten sygnał tkwi w doborze słów przez model, nie w żadnym znaku do zaznaczenia, i to narzędzie go nie dotyka, bo dotknąć się nie da. Więcej w tekstach o Claude i Gemini.
Pytania o ukryte znaki w kodzie AI
Czy to jest znak wodny AI?
Nie. Żaden większy dostawca nie używa niewidocznych znaków jako znaku wodnego, dałoby się je usunąć jednym czyszczeniem tekstu. To pozostałość typograficzna z renderowania odpowiedzi przez interfejs czatu, nie celowy sygnał.
Czy czyszczenie zepsuje formatowanie kodu?
Nie. Taby, znaki nowej linii i wcięcia zostają nietknięte. Usuwane są tylko niewidoczne punkty kodowe bez widocznego znaczenia, a nietypowe spacje są zastępowane zwykłą spacją, nie kasowane.
Więcej informacji
- Narzędzie po polsku.
- Niewidoczne znaki w kodzie - znaki sterujące kierunkiem i realne ryzyko bezpieczeństwa.
- Pełny artykuł (po angielsku), z pełną tabelą i przykładem w JavaScript.