Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

PHP6 en Unicode op phptek|2006

Een van de zwakke punten van PHP is Unicode ondersteuning, maar met PHP 6 komt daar een einde aan. Andrei Zmievski, ook bekend van PHP-GTK, gaf tijdens php|tek 2006 een presentatie over hoe PHP 6 met unicode zal omgaan. Ik geef, aan de hand van zijn presentatie slides, een overzicht van wat Andrei Zmievski allemaal te vertellen had.

De presentatie slides kun je vinden op zijn Talks pagina.

Basis uitbreidingen

PHP zal intensief gebruik maken van de ICU library, hierdoor worden iconv en mbstring minder belangrijk

Er zullen 2 string type's zijn: unicode en binary. Wanneer je een string normaal gebruikt zal deze standaard een unicode string zijn:

PHP:
  1. $str = "Unicode string: 1 character kan uit meerdere bytes bestaan.";

Om een binaire string te definieren zul je een stukje nieuwe syntax moeten gebruiken:

PHP:
  1. $str = b"Dit is een binaire string, 1 character = 1 byte";

Om te wisselen tussen deze twee kun je een cast-operator gebruiken:

PHP:
  1. $str = "á";
  2. $str_bin = (binary) $str;
  3. $str_uni = (unicode) $str_bin;

PHP zelf zal ook scripts in Unicode begrijpen. Je kunt dus unicode gaan gebruiken in de identifiers. Andrei geeft een voorbeeld voor de mensen die hun scripts graag obfuscaten op pagina 61 van zijn presentatie. Go check it out, seriously ;-)

Configuratie opties

  • unicode_semantics, die per virtual-server gewijzigd kan worden, kan gebruikt worden om aan te geven op wat voor manier Unicode gebruikt moet worden.
  • unicode.runtime_encoding geeft aan welke encoding gebruikt moet worden voor binary strings. Deze setting wordt ook gebruikt bij het aanroepen van functies die nog niet unicode-safe zijn.
  • unicode.output_encoding geeft aan welke encoding gebruikt moet worden voor de output die PHP genereert.

Fout afhandeling

Aangezien er nog wel eens wat fout kan gaan bij het omzetten van de ene encoding naar de andere encoding zal PHP 6 de nodige mogelijkheden bieden om dit af te vangen middels de unicode_set_error_mode() functie. Fouten kunnen genegeerd worden, omgezet naar een standaard karakter (deze kun je zelf opgeven) of er kan een error of exceptie veroorzaakt worden.

Omgaan met tekst: TextIterator en Collator

Er komt een nieuwe TextIterator die in staat zal zijn op verschillende manieren over tekst heen te wandelen. Zo kun je ieder aparte codepoint er mee uitlezen, maar je zou ook alleen hele zinnen kunnen opvragen:

PHP:
  1. $text = "Welkom op Scriptorama!";
  2.  
  3. foreach ( new TextIterator ( $text, TextIterator::WORD ) as $w) {
  4.   if (!empty($w)) {
  5.     echo $w, "\n";
  6.   }
  7. }

Ook de manier van werken met locales zal wijzigen. Het gebruik van setlocale() wordt afgeraden en daarvoor in de plaats komt nu de functie locale_set_default().

Andere talen hebben ook andere sorterings regels. In het duits volgt Ä bijvoorbeeld direct na de gewone A, terwijl deze in het zweeds pas na de Z komt. Het op deze manier sorteren (per land en/of taal) heet collation. Er komt dan ook een Collator klasse hebben waarmee je op de juiste manier, per locale, tekst kunt gaan vergelijken:

PHP:
  1. $coll = new Collator('de_DE');
  2.  
  3. if ( $coll->Compare('Ä', 'A')> 0) {
  4.   echo "Ä komt na A";
  5. }

Iedere locale heeft een eigen standaard Collator. Dit kan gemanipuleerd worden met collator_set_default().

Unicode en streams

Standaard zullen alle functies die via de Streams API werken, dit zijn bijvoorbeeld alle bestands functies, binary strings retourneren. Met behulp van de functie unicode_decode() zou je dit eventueel kunnen omzetten naar Unicode.

Wil je toch graag direct Unicode uitlezen of wegschrijven, dan kun je bijvoorbeeld aan fopen() de optie 't' meegeven als modus. PHP zal dan de data in de encoding uit te lezen die in de optie encoding gedefinieerd staat.

Een andere optie is om de default encoding van de streams te wijzigen dmv. de stream_default_encoding() functie danwel met een aparte stream context. Wanneer je de context creert kun je de optie 'encoding' meegeven met daarin de gewenste encoding naam.

Conclusie

Er zal een hoop veranderen en er zijn zo te zien een stuk of 5 nieuwe configuratie opties waar je toch wel echt rekening mee moet gaan houden. De TextIterator en Collator objecten zien er erg interessant uit en ook de foutafhandeling ben ik erg over te spreken. Wat me nog niet helemaal duidelijk is, is of de locales die gebruikt worden voor collation, ook gebruikt zullen worden voor locale-afhankelijke functies zoals strftime() en money_format() bijvoorbeeld.

Andrei Zmievski waarschuwt in zijn presentatie nog wel dat er verschillende dingen kunnen veranderen aangezien de gehele implementatie nog niet is afgerond. Mijn persoonlijke wens zou dan toch zijn om het aantal configuratie opties waarin je de encoding kunt aangeven te verminderen.

Wil je zelf eens PHP 6 proberen? Op http://snaps.php.net/ kun je de broncode maar ook binaries downloaden. Laat je je ervaringen weten op ons forum ?

Reageer ook!

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>