Wszystkie artykuły

String Escape: dlaczego ten sam tekst trzeba escapować inaczej

W Polsce pliki CSV eksportowane z Excela zwykle używają średnika zamiast przecinka jako separatora, bo przecinek jest separatorem dziesiętnym w polskim formacie liczb. Pole zawierające polskie znaki diakrytyczne i średnik, np. Kowalski; ąęćłńóśźż, trzeba więc ująć w cudzysłów: "Kowalski; ąęćłńóśźż", a cudzysłów wewnątrz samej wartości escapuje się przez podwojenie ("") — to zupełnie inna reguła niż backslash używany w JS czy JSON.

Escapowanie w ciągu JavaScript/JSON

W literałach ciągów JS i w JSON znaki specjalne escapuje się ukośnikiem wstecznym: \" dla cudzysłowu, \n dla nowej linii, \\ dla samego ukośnika wstecznego. JSON dodatkowo wymaga, by wszystkie ciągi używały cudzysłowów podwójnych — w przeciwieństwie do JS, gdzie dopuszczalne są też pojedyncze.

Escapowanie w poleceniach powłoki

W wierszu poleceń znakami specjalnymi są m.in. spacja, cudzysłowy, znak dolara, gwiazdka — mają one specjalne znaczenie dla powłoki (shell). Spację wewnątrz argumentu polecenia trzeba escapować albo cały argument ująć w cudzysłów, inaczej powłoka podzieli go na dwa osobne argumenty.

Escapowanie w wyrażeniach regularnych

W wyrażeniach regularnych znaki takie jak kropka, gwiazdka czy nawiasy mają specjalne znaczenie (dowolny znak, kwantyfikator, grupa). Aby dopasować je dosłownie, a nie jako metaznaki, poprzedza się je ukośnikiem wstecznym: \. dopasowuje dosłowną kropkę, a nie "dowolny znak".

Dlaczego każdy kontekst wymaga własnego escapowania

Błędy "podwójnego escapowania" lub "niepełnego escapowania" to jedna z najczęstszych przyczyn zepsutego kodu przy wstawianiu tekstu od użytkownika (np. ścieżki do pliku ze spacją) do polecenia lub ciągu znaków. Poprawne escapowanie zależy od tego, gdzie dokładnie tekst jest wstawiany, a nie od samego tekstu.

Do czego się to przydaje

  • Przygotowanie tekstu użytkownika z polskimi znakami diakrytycznymi do bezpiecznego wstawienia w żądaniu JSON lub w pliku CSV z separatorem-średnikiem.
  • Zbudowanie polecenia powłoki z dynamicznym argumentem bez ryzyka wstrzyknięcia poleceń.
  • Escapowanie znaków specjalnych przed użyciem tekstu jako dosłownego wzorca w wyrażeniu regularnym.

Podwójne escapowanie w zagnieżdżonych kontekstach

Gdy tekst przechodzi kolejno przez dwa konteksty — np. ciąg jest wstawiany do JSON, a ten JSON jest przekazywany jako argument polecenia powłoki — escapowanie trzeba zastosować we właściwej kolejności: najpierw dla kontekstu wewnętrznego (JSON), potem dla zewnętrznego (shell). Odwrócona kolejność lub pominięty poziom to częsty powód, dla którego "poprawnie zescapowany" ciąg i tak psuje się w praktyce.

Wypróbuj narzędzie