mb_detect_encoding() nie wspiera WINDOWS-1250

php-logo

W dzisiejszych czasach niezaplątamy sobie głowy kodowaniem tworząc aplikacje w PHP. UTF-8 stał się tak popularny, że nasz zakątek świata nie potrzebuje niczego innego, a jednak…

Gorzej jeśli przyjdzie nam się zderzyć ze światem Windows i z plikami wynikowymi z tego środowiska. Oczywiście, do konwersji WINDOWS-1250 do innego kodowania możemy użyć iconv. Ale co w przypadku gdy nie wiemy skąd pochodzi plik, a w swoim nagłówku nie ma zdefiniowanego kodowania?

Taki przypadek możemy mieć w przypadku plików TXT czy CSV, których zawartość chcemy zaimportować. I wczoraj doznałem szoku. Okazuje się, że PHP nadal w pełni nie obsługuje WINDOWS-1250 – centralno europejskiego kodowania od Microsoftu. Mimo, że w tym celu powstało rozszerzenie MultiByte String wśród wspieranych kodowań brak WINDOWS-1250. W 2009 roku ten błąd był nawet zgłoszony, ale nikt się nim nie zajął.

Przewertowałem sieć i nie znalazłem funkcji, która umożliwiałaby wykrycie kodowania dla pliku, w którym możemy spodziewać się polskich znaczków, tj. UTF-8, WINDOWS-1250, ISO-8859-2. Już chciałem sobie odpuścić, ale to przecież coś bez czego tak naprawdę trudno się obyć.

Kilka minut z konsolą, i proszę – funkcja detectEncoding z obsługą WINDOWS-1250, UTF-8, ISO-8859-2.

 

I teraz możemy już konwertować pliki bez znajomości kodowania:
iconv(detectEncoding($string), 'UTF-8′, $string).