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.

questionAnswers(3)

yourAnswerToTheQuestion