Blog

Karakterkódolás Update

Publikálva: 2014.08.06 09:00
Karakterkódolás Update

Örültem, mikor több forrásból is kaptam visszajelzéseket az előző "Kevert karakterkódolás" című bejegyzésem után. Volt közte egy nagyon hasznos is kedves ismerősömtől. Kipróbálta az általam készített programkódot, sajnos nála nem működött. Ott a futtató környezet php 5.4 volt, míg én a jól bevált 5.3-as php-t használtam. Erre is lett megoldás.

Több okból is hasznosnak éreztem/érzem a kevert karakterkódolású cikkem:

  • van értelme forráskódot megosztani másokkal, mert vagy kijavítják, vagy ajánlanak helyette elegánsabbat,
  • esetleg ki is próbálják, tesztelgetik a programot,
  • jó tudni, hogy a cikkem hatására más is elmélyül az általam kiszemelt témában.

Karakterkódolási probléma php 5.4 alatt

Ha a szövegünk valamilyen oknál fogva nem látható, úgynevezett kontroll karakterekkel vannak megtűzdelve, az XML feldolgozás hibával le fog állni. Most ezen karakterek kivédésére kaptam egy elegánsabb, szebb megoldást, ami működik az 5.4-es php verzió alatt is:

$string = preg_replace('/\p{C}+/u', '', $string);

Szóval ennyire egyszerűen is el lehet intézni. A "\p" escape segítségével elkaphatjuk a kontroll karaktereket (infó itt). Az "u" kapcsolóval pedig elérhetjük a PCRE kiegészítő funkcióját, miszerint a preg_replace függvény $pattern és $subject attribútumát utf8-ként kezelje (infó itt).

A végleges megoldás

Mivel az új sor, vagy tabulátor karakterek is beleesnek a kontroll karakterek közé, így a következő megoldás lehet hasznos, feltéve ha a szövegünkben szükség van ezekre a karakterekre:

$string = preg_replace('/[^\P{C}\n\r\t]+/u', '', $string);

Ez a megoldás hasonló a fentihez. De ne kerülje el senki figyelmét, hogy a fenti esetben a "\p" kapcsoló volt használva, úgy ez utóbbinál a "\P". Ha a két kapcsolót így használjuk az teljesen ekvivalens: \p{C} == ^\P{C}. Vagyis fordítva közelítettük meg a problémát, hogy egy kis kiegészítéssel a sortörés, tabulátor karakterek megmaradjanak a szövegünkben.

Kapcsolódó cikkek