Kod źródłowy PHP w plikach UTF-8; jak prawidłowo interpretować?
Buduję narzędzia do analizy kodu źródłowego. Takie narzędzia muszą poprawnie odczytywać pliki kodu źródłowego, zwłaszcza w odniesieniu do kodowania znaków. Na przykład: „Jaki jest dokładny ciąg bajtów w literale ciągu?” (zarówno literały PHP, jak i tekst HTML).
Moim błędnym zrozumieniem jest to, że pliki źródłowe PHP mają tylko 8-bitowy charakter (tzn. Silnik PHP odczytuje je w ten sposób [w prawo]?, Ponieważ mają zawierać tylko 8-bitowe znaki). Ale osiem znaków bitowychjakie kodowanie? (Zakładam, że zamierzam dopasować ISO-8859-1 (-x?) [Czy ktoś może cytować rozdział i wiersz?] To znaczy, że umlaut ma być umlautem, prawda? Po tym można pisać skrypty PHP za pomocą HTML i struny dla większości narodów europejskich / zestawów znaków wprost.
Ale jasne jest, że jest to problematyczne z Unicode. O ile wiem, większość aplikacji PHP radzi sobie z Unicode głównie poprzez ciągi zawierające sekwencje bajtów UTF-8, które można wstawić w 8-bitowe ciągi PHP. Następnie można wygenerować skrypty, których HTML zawiera sekwencje Unicode UTF-8, jeśli powiesz swojemu serwerowi, że generujesz tekst UTF-8.
W powyższych sytuacjach można odczytać plik PHP jako 8-bitowy tekst znakowy i wydaje mi się, że pasuje on do języka.
To, co mnie intryguje, to pliki źródłowe PHP zakodowane jako UTF-8 (pakiet Joomla ma ~ 1800 plików źródłowych, z czego około 10 to UTF-8, a reszta nie). Dowolne (inne niż ASCII) znaki europejskie, które wyświetlają się poprawnie w renderowaniu UTF-8, są faktycznie zakodowane jako sekwencje wielobajtowe. Przypuszczam, że takie strony podawane jako UTF-8 będą miały poprawnie renderowany HTML. Jednak żadne porównania ciągów znaków europejskich lub innych znaków Unicode, które najwyraźniej renderują się poprawnie w edytorze tekstu, po prostu nie działają. A literały łańcuchów nie zawierają tego, co zawierają. Czy programiści używają plików UTF-8, ponieważ to właśnie oferują redaktorzy? Czy robią to celowo? Czy może po prostu wypadek, który nie ma znaczenia dla większości prac?
Jak więc odczytać plik źródłowy PHP? (w szczególności, w jakim kodowaniu znaków?) Jedną możliwą odpowiedzią jest zawsze 8-bitowe kody ISO-8859-1, niezależnie od rzeczywistej zawartości lub zestawień materiałowych (widzę wiele plików PHP oznaczonych BOM UTF-8). Inną odpowiedzią jest UTF-8, jeśli tak zaznaczono.
[Nasze narzędzia odczytują i zapisują dowolne kodowania. „Trywialnym” narzędziem jest kodowanie odczytu w jednym znaku, pisania identycznych punktów kodu w innym kodowaniu. Odczytując w ten sposób pliki PHP UTF-8, mamy problem z pisaniem plików równoważnych ISO8859-1, ponieważ wiele punktów kodowych UTF-8 (np. Symbol euro) nie może być zakodowanych w ISO8859-x.]
EDYTUJ 30 sierpnia: Sprawdzamy teraz pliki PHP, aby sprawdzić, czy mają zestawienia materiałowe UTF-8, lub wydają się mieć sekwencje UTF-8, które są legalne. W każdym z tych przypadków odczytujemy plik jako UTF-8; w przeciwnym razie domyślnie czytamy to jako ISO8859-1. Zachowujemy teraz kodowanie plików, jeśli je zmodyfikujemy. (Uzyskanie tego wszystkiego to dość dużo pracy). To wydaje się być bezpieczną strategią, ale może być inna niż ta, której oczekują programiści PHP.