Showing posts with label UTF. Show all posts
Showing posts with label UTF. Show all posts

Friday, February 2, 2007

Encoding Problem?

Отново намерих време да драсна. Чудех се за какво, но тъй като тази седмица нямаше нищо интересно в web пространството, реших да споделя малко опит в решаването на най-дразнещия неамерикански проблем - кодирането на информацията. По времето на HTML4, това не беше никакъв проблем. Просто сменяш кодирането в <meta> тага, сменяш файла и това е. После обаче PHP стана толкова масово явление, че изведнъж всеки започна да разхвърля информация по всякакви $_POST-ове и $_GET-ове и тази информация не винаги се показваше в правилният формат накрая. А когато към всичко това добавим charset & collation на MySQL сървъра, таблицата и текущата база данни, плюс AJAX и сървър настройките, картинката става вече наистина потресаваща.
При всички случаи ни трябва стандарт. Трябва ни нещо, в което да можем да си сейвнем файловете, и после да го нагласим във всички останали хедъри и настройки. UTF-8 би бил перфектният вариянт, но за съжаление PHP и UTF-8 не работят пълноценно. Проблемът идва от хедъра на файловете, които са сейвнати в UTF-8 енкодинг. Там, в самото начало, изскачат няколко байта повече, които PHP интерпретира като output и затова не ползволява да се пращат никакви хедъри (вкл. сесии). Отвратително. Това, обаче, ще се промени с излизането на PHP6, и аз ще съм един от най-щастливите хора на земята.
До тогава мисля да процедирам по следният начин.
  1. Избира се един алтернативен енкодинг (например cp-1251 за кирилица, ISO-8859-1 за латиница и т..н);
  2. В този енкодинг се записват файловете и информацията;
  3. Същият енкодинг се изпраща и от сървъра.
  4. Същият енкодинг се пише в <meta> тага (ДА НЕ СЕ ЗАБРАВЯ!)
По този начин сме сигурни, че всичко ще се показва правилно и ще достига правилно до браузъра, а пък FireFox няма да се прави на умен и да пренаписва хедърите. (Не знам защо "Лисицата" не харесва UTF хедъри... но такъв е животът.) Сега остава да решим проблема със записването и транспортирането на информацията. Ако пишем добър код, следвайки препоръките за MVC (за които постнах тук), би трябвало за тази част от сайта да се грижат други скриптове. Затова предприемаме следните стъпки:
  1. В началото на всеки файл пренаписваме хедъра на сървъра на UTF-8, а където играе MySQL - "set names utf-8";
  2. default charset, енкодинг и колация на MySQL се настройват за UTF-8;
  3. Ако на фронтенда ползваме AJAX, енкодираме всичките променливи в UTF-8 & URL encoding. За целта препоръчвам WebToolKit. Ако не - при филтрирането на $_REQUEST-а използваме utf8_encode();
  4. Съответно, при извеждане на информацията, използваме utf8_decode() или iconv(), така че да имаме данните готови за показване в другия енкодинг.
Надявам се да съм помогнал и да съм спестил мъки на много хора.