Teckenkodning Pa Webben Pt 2

4,040 views
3,909 views

Published on

In Swedish. En genomgång av hur man behöver förhålla sig till och kan styra upp sin teckenkodning i en LAMP-miljö

Published in: Technology
2 Comments
1 Like
Statistics
Notes
No Downloads
Views
Total views
4,040
On SlideShare
0
From Embeds
0
Number of Embeds
49
Actions
Shares
0
Downloads
12
Comments
2
Likes
1
Embeds 0
No embeds

No notes for slide
  • Teckenkodning Pa Webben Pt 2

    1. 1. Teckenkodning på webben – praktiska exempel, del 1 Lars Gunther, Keryx <ul><ul><li>En genomgång av hur man behöver förhålla sig till och kan styra upp sin teckenkodning i en LAMP -miljö </li></ul></ul>
    2. 2. ” Disclaimer” <ul><li>PHP version 6 är fortfarande under utveckling och somliga detaljer diskuteras livligt bland utvecklarna. </li></ul><ul><li>Se allt om PHP 6 i denna presentation (gjord januari 2007) som prognoser – inte några löften! </li></ul><ul><li>Detta är en tidig alfa-version av föredraget. Det är ännu inte klart på något sätt. </li></ul>
    3. 3. Terminologi: en väg genom ett förvillat landskap – del 1 <ul><li>Glyfer </li></ul><ul><ul><li>Eng: ”glyph” </li></ul></ul><ul><li>Tecken </li></ul><ul><ul><li>Eng: ”character” </li></ul></ul><ul><li>Repertoar </li></ul><ul><ul><li>Eng: ”Character repertoire” </li></ul></ul><ul><ul><li>En uppsättning tecken, en mängd. Utan ordning. </li></ul></ul><ul><ul><li>” Character set” (första, men ovanliga, betydelsen) </li></ul></ul><ul><li>Teckentabell </li></ul><ul><ul><li>Eng: ”Character code” </li></ul></ul><ul><ul><li>Varje tecken har sin ”code position”, ”code point” , ”code number”, ”code element”, ”code set value” eller rätt och slätt ”code” </li></ul></ul><ul><ul><li>” Character set” (andra betydelsen) </li></ul></ul><ul><ul><li>Repertoar (en andra – felaktig – betydelse): Delsumma av en teckentabell </li></ul></ul>
    4. 4. Terminologi: en väg genom ett förvillat landskap – del 2 <ul><li>Teckenkodning </li></ul><ul><ul><li>Den sekvens nollor och ettor som representerar ett tecken. </li></ul></ul><ul><ul><li>Tack vare detta kan text lagras och förmedlas . </li></ul></ul><ul><ul><li>På webben förekommer lagring och förmedling! </li></ul></ul><ul><ul><li>” Character set” – tredje och vanligaste betydelsen </li></ul></ul><ul><ul><ul><li>” charset” som HTTP-huvud </li></ul></ul></ul><ul><ul><ul><li>Inställningar i Apache, MySQL, etc. </li></ul></ul></ul><ul><li>Font </li></ul><ul><ul><li>Tack vare dessa kan tecken visas på skärm eller skrivas ut </li></ul></ul><ul><ul><li>Styrs via CSS idag, lämnas därhän i detta föredrag </li></ul></ul>
    5. 5. Teckenkodning: ASCII, ISO, ANSI och UTF-8 <ul><li>US-ASCII – 7 bit per tecken. Bara engelska. </li></ul><ul><li>ISO-8859-1 – 8 bit per tecken </li></ul><ul><ul><li>Tecken 0-127 identisk med US-ASCII </li></ul></ul><ul><li>Windows 1252 (ANSI) </li></ul><ul><ul><li>Bygger på Latin 1/ISO-8859-1, men använder intervallet 128-159 (Hex 80-9F) </li></ul></ul><ul><ul><li>Konsekvens: Tecken 0-127 identisk med US-ASCII </li></ul></ul><ul><li>UTF-8 (Unicode Transformation Format – 8 bitars) </li></ul><ul><ul><li>Tecken 0-127 identisk med US-ASCII (en byte per tecken) </li></ul></ul><ul><ul><li>Därefter flexibelt antal bytes (minimum 2) per tecken </li></ul></ul>
    6. 6. ” Överkodning” – skicka alla tecken som vore de ASCII, men ändå inte… <ul><li>Problemet: Det överliggande protokollet (IMAP, SMTP, FTP, etc) klarar bara ASCII </li></ul><ul><ul><li>Närliggande: Du vill skicka binär data genom ett system gjort för text. </li></ul></ul><ul><ul><li>Närliggande: Du vill kunna skicka sådana tecken som normalt är styrkoder, som tryckbara: Null, beep, line-feed… </li></ul></ul><ul><ul><li>Fara: Styrkoder kan slinka igenom och skapa SQL-injektion, XSS, etc. </li></ul></ul><ul><li>Exempeltext: </li></ul><ul><ul><ul><li>abc 123 åäö ÅÄÖ +/=; </li></ul></ul></ul><ul><li>application/x-www-form-urlencoded. </li></ul><ul><ul><li>För URL:er </li></ul></ul><ul><ul><ul><li>abc+123+%E5%E4%F6+%C5%C4%D6+%2B%2F%3D%3B </li></ul></ul></ul><ul><ul><li>RFC1738 (ersätter ”+” med ”%20”) </li></ul></ul><ul><ul><ul><li>abc%20123%20%E5%E4%F6%20%C5%C4%D6%20%2B%2F%3D%3B </li></ul></ul></ul>
    7. 7. ” Överkodning”, forts. <ul><li>” Quoted printable”. </li></ul><ul><ul><li>Från ISO till ASCII </li></ul></ul><ul><ul><li>Ursprunglig lösning för ÅÄÖ, etc. i mejl. </li></ul></ul><ul><ul><ul><li>abc 123 =E5=E4=F6 =C5=C4=D6 +/=3D; </li></ul></ul></ul><ul><li>UTF-7. </li></ul><ul><ul><li>Från UTF till ASCII. </li></ul></ul><ul><ul><li>Används i moderna mejlsystem, såsom IMAP. </li></ul></ul><ul><ul><ul><li>abc 123 &5eT2- &xcTW- +/=; </li></ul></ul></ul><ul><li>Base-64. </li></ul><ul><ul><li>Lämplig för binär data. </li></ul></ul><ul><ul><li>Du kan infoga ett objekt i HTML-koden! </li></ul></ul><ul><ul><ul><li>YWJjIDEyMyDl5PYgxcTWICsvPTs= </li></ul></ul></ul>
    8. 8. Kollationering <ul><li>Kollationering = ”arrangera i ordning” </li></ul><ul><li>Beror på språket och kan inte lösas bara med teckenkodningen </li></ul><ul><li>Beror dessutom på specifika variationer (”territoriet”) </li></ul><ul><li>Ex. Svensk svenska kontra finsk svenska </li></ul><ul><li>http://en.wikipeda.org/wiki/Locale </li></ul><ul><li>http://en.wikipedia.org/wiki/Collating_sequence </li></ul>
    9. 9. Användningsplatser
    10. 10. I webbläsaren
    11. 11. Hur webbläsaren tolkar HTML <ul><li>Om det finns ett HTTP-huvud, använd det: </li></ul><ul><ul><li>Vanligtvis: ”Content-type”. Ex. ”text/html; charset=iso-8859-15” </li></ul></ul><ul><ul><li>OBS! Om Content-type anges, men utan charset, så anses den vara satt till default och därmed ändå angiven! </li></ul></ul><ul><li>Om teckenkodningen anges med en Byte Order Mark (BOM), använd den. </li></ul><ul><ul><li>Detta gäller bara Unicode-varianter, såsom UTF-8 </li></ul></ul><ul><ul><li>PHP, och andra tekniker, fungerar inte med BOM. Använd inte BOM!!! </li></ul></ul><ul><li>Titta på meta-elementet i HTML-koden </li></ul><ul><ul><li>Kräver att teckenkodningen är ASCII-kompatibel </li></ul></ul><ul><li>Default: iso-8859-1 </li></ul>
    12. 12. Hur webbläsaren tolkar äkta XHTML <ul><li>Vad menas? </li></ul><ul><ul><li>Data sänd som application/xhtml+xml </li></ul></ul><ul><ul><li>Filändelsen xhtml </li></ul></ul><ul><ul><li>Internet Explorer kan inte XHTML! </li></ul></ul><ul><li>HTTP-huvud </li></ul><ul><li>BOM </li></ul><ul><li>Titta på XML-prologen </li></ul><ul><li>Default: UTF-8 </li></ul>
    13. 13. Hur webbläsaren tolkar CSS eller JavaScript <ul><li>Tittar först på HTTP-huvudet, likt (X)HTML </li></ul><ul><li>CSS har ” @charset ” </li></ul><ul><li>JavaScript använder alltid Unicode internt </li></ul><ul><ul><li>Strängar lagras som code points , inte med en enskild kodning! </li></ul></ul><ul><ul><li>Oavsett teckenkodningen på sidan eller skriptet </li></ul></ul>
    14. 14. Apache och teckenkodning <ul><li>Direktiv </li></ul><ul><ul><li>addDefaultCharset = Vilken teckenkodning skall användas när MIME-typen är text/plain eller text/html </li></ul></ul><ul><ul><ul><li>off = funktionen avstängd </li></ul></ul></ul><ul><ul><ul><li>on = iso-8859-1 </li></ul></ul></ul><ul><ul><ul><li>Ange annars namnet på teckenkodningen </li></ul></ul></ul><ul><ul><li>addCharset = Koppla till filändelse </li></ul></ul><ul><ul><ul><li>addCharset EUC-JP .euc </li></ul></ul></ul><ul><ul><ul><li>addCharset iso-8859-1 .xhtml </li></ul></ul></ul><ul><li>OBS! När apache kallar något ”encoding”, så menas inte teckenkodning, utan om informationen skall skickas komprimerad (ex. gzip) eller ej. </li></ul>
    15. 15. Apache och teckenkodning, forts <ul><li>Kontext </li></ul><ul><ul><li>Hela servern – httpd.conf </li></ul></ul><ul><ul><li>Per virtuell server – <virtualHost> </li></ul></ul><ul><ul><li>Per katalog – <Directory> </li></ul></ul><ul><ul><li>.htaccess </li></ul></ul><ul><ul><ul><li>Den jag som kund på ett webbhotell kan styra </li></ul></ul></ul><ul><ul><li>Per skript med PHP (vi återkommer till det) </li></ul></ul><ul><li>Enklaste sättet att styra upp via .htaccess </li></ul><ul><ul><ul><li>AddDefaultCharset iso-8859-1 </li></ul></ul></ul>
    16. 16. Från webbläsaren
    17. 17. Vilken kodning som skickas från webbläsaren <ul><li>Normalt: Samma som sidan i sig har som teckenkodning. </li></ul><ul><li>Angiven som parameter i <form accept-charset=””> </li></ul><ul><li>Indatakontroll krävs på seriösa applikationer </li></ul><ul><ul><li>Teckenkodningen kan i sig ställa till med strul </li></ul></ul><ul><ul><li>Teckenkodningen kan maskera andra attacker </li></ul></ul><ul><ul><li>Det är inte ens säkert du får din data från en webbläsare! </li></ul></ul><ul><li>Konvertering kan krävas </li></ul>
    18. 18. PHP internt
    19. 19. PHP internt idag (PHP 4 och 5) <ul><li>ISO-8859-1 förutsätts med visst stöd för unicode </li></ul>Bild från: http://phuson.com/v2/article/php-and-unicode-fun (CC)
    20. 20. PHP internt idag, forts. <ul><li>Strängfunktionerna: en byte per tecken </li></ul><ul><ul><li>Om de inte överladdas </li></ul></ul><ul><ul><li>Men det ger icke-portabel kod </li></ul></ul><ul><li>mb_string </li></ul><ul><ul><li>Enkelt fel: Att inte använda mb_strlen() </li></ul></ul>
    21. 21. PHP internt idag, forts. <ul><li>XML-funktionerna ”defaultar” till UTF-8 </li></ul><ul><ul><li>Logiskt för XML </li></ul></ul><ul><ul><li>Andra teckenkodningar måste konverteras innan de skickas till XML-funktionerna </li></ul></ul>
    22. 22. Konverteringsfunktioner <ul><li>utf8_encode </li></ul><ul><ul><li>Från iso till UTF-8 </li></ul></ul><ul><li>utf8_decode </li></ul><ul><ul><li>Från UTF-8 till ISO </li></ul></ul><ul><li>iconv </li></ul><ul><ul><li>Till/från nästan varje teckenkodning </li></ul></ul>
    23. 23. PHP header <ul><li>Ställ in HTTP-huvudet med PHP </li></ul><ul><li>Kör över Apache-inställningarna </li></ul><ul><li>header(”Content-type: text/html; charset=utf-8”); </li></ul><ul><li>header(”Content-type: application/xhtml+xml; charset=utf-8”); </li></ul><ul><li>Också för andra slags filer: </li></ul><ul><ul><li>header(”Content-type: text/plain; charset=utf-8”); </li></ul></ul><ul><ul><li>header(”Content-type: text/css; charset=utf-8”); </li></ul></ul><ul><ul><li>header(”Content-type: image/png”); // Inget charset på binär data! </li></ul></ul>
    24. 24. ” Överkodningsfunktioner” <ul><li>Urlencode/urldecode </li></ul><ul><ul><li>application/x-www-form-urlencoded </li></ul></ul><ul><li>rawurlencode/rawurldecode </li></ul><ul><ul><li>%20 i stället för + </li></ul></ul><ul><li>imap_utf7_encode/decode </li></ul><ul><ul><li>Unicode Transformation Format 7 </li></ul></ul><ul><li>imap_8bit/imap_qprint </li></ul><ul><ul><li>Quoted printable </li></ul></ul><ul><li>imap_utf7_encode/decode </li></ul><ul><li>base64_encode/decode </li></ul>
    25. 25. Exkurs: PHP och formulär <ul><li>PHP sköter som regel om ”överkodning” av formulärdata </li></ul><ul><ul><li>Urlencode/urldecode resp. rawurlencode/rawurldecode behöver man bara använda i specialfall </li></ul></ul><ul><li>PHP lägger dock ofta in backslash framför vissa tecken för att försvåra bl.a. SQL-injektion, XSS och kodinjektion. </li></ul><ul><ul><li>” Magic Quotes GPC” (Get Post Cookie) </li></ul></ul><ul><ul><li>Funktionen är i praktiken mer till besvär än glädje. </li></ul></ul><ul><ul><li>Skyddet är på tok för klent. </li></ul></ul><ul><ul><li>Feltänk: Man ”eskejpar” input ! Regeln är: ” Filter input, escape output ” </li></ul></ul><ul><li>Funktionaliteten kommer tas bort i PHP 6 </li></ul>
    26. 26. Exkurs, forts: Ta bort Magic Quotes <ul><li>if ( ini_get('magic_quotes_sybase') ) { // Mycket ovanlig databas trigger_error(E_USER_ERROR,' Magic Quotes Sybase is on '); </li></ul><ul><li>} </li></ul><ul><li>if ( get_magic_quotes_gpc() ) { array_walk_recursive($_GET,' stripslashes '); array_walk_recursive($_POST,' stripslashes '); array_walk_recursive($_COOKIE,' stripslashes '); </li></ul><ul><li>} </li></ul>
    27. 27. Multibyte-funktioner <ul><li>PHP kan redan använda Unicode </li></ul><ul><ul><li>Detta funkar idag (PHP 5): function säg_hebreiska() { echo ' עברית ' ; } function säg_arabiska() { echo ' عَرَبيْ ' ; } </li></ul></ul><ul><li>Svårigheten är att skriva tecknen på ett latinskt tangentbord! </li></ul>
    28. 28. Multibyte-funktioner, forts. <ul><li>Strängfunktionerna kräver enkelbytekodning </li></ul><ul><ul><li>Detta funkar inte som väntat: echo strlen( ' עברית ' ); </li></ul></ul><ul><ul><li>Blir troligen 10 och inte 5. strlen räknar bytes. </li></ul></ul><ul><ul><li>Inte heller sortering och liknande funkar </li></ul></ul><ul><li>De flesta strängfunktioner har en motsvarande multi-byte funktion </li></ul><ul><ul><li>Detta funkar: echo mb_strlen( ' עברית ' ); </li></ul></ul>
    29. 29. PHP 6 <ul><li>PHP 6: UTF-16 i den inre logiken, data förväntas vara UTF-8 </li></ul><ul><ul><li>Switchar i php.ini styr detta (omdiskuterat) </li></ul></ul><ul><li>En ny strängtyp: unicode </li></ul><ul><li>Kraftigt förbättrat stöd för kollationering och andra aspekter av internationalisering </li></ul><ul><li>Bygger på ICU-biblioteket </li></ul>
    30. 30. Framtidssäker kod <ul><li>Använd inte ctype -funktionerna. De stödjer inte unicode och kommer ersättas i PHP 6. </li></ul><ul><ul><li>Tråkigt: ctype-funktionerna är enkla, snabba och tar hänsyn till Locale. </li></ul></ul><ul><ul><li>Vad kommer i stället? </li></ul></ul><ul><li>Använd inte POSIX reguljära uttryck (ereg). Endast PERL reguljära uttryck (preg) fungerar med Unicode. </li></ul><ul><ul><li>De är ändå överlägsna både i kraft och fart! </li></ul></ul>
    31. 31. Editorer och operativsystem <ul><li>Vad för teckenkodning har din editor? </li></ul><ul><li>Linux har UTF-8 som default </li></ul><ul><li>Mac OS X har UTF-8 som default </li></ul><ul><ul><li>Äldre Mac OS hade sin egen teckenkodning </li></ul></ul><ul><li>Windows teckenkodning (ANSI) är problematisk, se till att du använder ISO eller Unicode på webben! </li></ul><ul><li>Vad har Windows Vista????? </li></ul><ul><li>Se till att din Editor stödjer olika teckenkodningar och olika radslut. </li></ul>
    32. 32. Exkurs: Lokalisering <ul><li>Locale </li></ul><ul><ul><li>Land, plats </li></ul></ul><ul><ul><li>Språk. Speciellt kollationering </li></ul></ul><ul><ul><li>Decimaltecken och tusentalsavgränsare – localeconv() </li></ul></ul><ul><ul><li>Valuta – localeconv() </li></ul></ul><ul><ul><li>Datum och klockslag – strftime() </li></ul></ul><ul><ul><li>Hantering av versaler och liknande i rubriker – strtoupper() </li></ul></ul><ul><li>PHP 5 – använder (vanligtvis) POSIX locale </li></ul><ul><ul><li>setlocale() </li></ul></ul><ul><li>PHP 6 – kommer använda mer exakta ICU locale </li></ul><ul><ul><li>Locale::set_default() </li></ul></ul><ul><ul><li>ICU locales skrivs lite annorlunda än POSIX-dito: <language>[_<script>]_<country>[_<variant>][@<keywords>] </li></ul></ul>
    33. 33. Exkurs: Tidsinställningar <ul><li>Formatet, för strftime(), styrs av setlocale() </li></ul><ul><li>Tidszonen ställs in med putenv() i PHP <= 5.0 </li></ul><ul><ul><li>putenv(' TZ=Europe/Stockholm '); </li></ul></ul><ul><ul><li>Denna funktion tar sina inställningar från operativsystemet, och ger ett mindre exakt och ibland felaktigt resultat. </li></ul></ul><ul><li>Med date_default_timezone_set() i PHP 5.1+ </li></ul><ul><ul><li>date_default_timezone_set(' TZ=Europe/Stockholm '); </li></ul></ul><ul><ul><li>Denna funktion bygger på mer exakt information, som byggts in i PHP. </li></ul></ul><ul><ul><li>Uppgraderingar finns på adressen http://pecl.php.net/package/timezonedb </li></ul></ul><ul><ul><li>Informationen har lånats från ”Olson”-databasen – http://en.wikipedia.org/wiki/Zoneinfo </li></ul></ul>
    34. 34. Exkurs: Lokaliseringskommandon i PHP 5 <ul><li>$LOCALE = setlocale(LC_ALL, ' sv_SE ', ' sv_SE.utf8 ', ' sv_SE.iso88591 ' ' swedish ',' sve '); </li></ul><ul><li>Argumenten prövas i tur och ordning och det första som fungerar används, samt returneras. </li></ul><ul><li>Posix-format: </li></ul><ul><ul><li>Språk_Territorium.[Teckenkodning][@Modifierare] </li></ul></ul><ul><li>Windows stödjer officiellt trebokstäversvarianten (TLA, Three Letter Acronyms”) </li></ul><ul><li>” Swedish” funkar på de flesta system, enligt min erfarenhet </li></ul>
    35. 35. PHP strömmar och sockets
    36. 36. Strömmar och sockets <ul><li>Samlingsnamn på PHP:s kommunikation med databaser, filer, andra servrar, etc </li></ul><ul><li>Vilken teckenkodning används för skickad data? </li></ul><ul><li>Vilken används för hämtad data? </li></ul><ul><li>Vilken används för förbindelsen som sådan? </li></ul>
    37. 37. MySQL
    38. 38. Teckenkodning och kollationering i MySQL <ul><li>Ange för en tabell (enklast) </li></ul><ul><li>Ange för ett fält </li></ul><ul><li>Ange i en enstaka SQL-fråga </li></ul><ul><ul><li>Ovanligt, användbart för att temporärt ha en annan kollationering </li></ul></ul><ul><li>my.cnf: </li></ul><ul><ul><ul><li>default-character-set=utf8 </li></ul></ul></ul><ul><li>Ange för uppkopplingen </li></ul><ul><ul><li>Från kommandoraden: charset utf8 </li></ul></ul><ul><ul><li>SET NAMES 'charset name' COLLATE 'collation name' </li></ul></ul><ul><ul><li>SET CHARACTER SET = 'charset name' </li></ul></ul><ul><li>http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html </li></ul>
    39. 39. Skriva och läsa filer
    40. 40. ” File sockets” <ul><li>Info kommer… </li></ul>
    41. 41. ” File sockets” i PHP 6 <ul><li>PHP 5 </li></ul><ul><ul><li>Öppna alltid binärt, såvida du inte vill på windows system konvertera till </li></ul></ul><ul><ul><li>Dvs. använd inte t-flaggan! </li></ul></ul><ul><li>PHP 6 </li></ul><ul><ul><li>T-flaggan säger dessutom nu att överföringen skall betraktas som potentiellt multi-byte teckenkodad </li></ul></ul><ul><ul><li>Dvs. använd t-flaggan! </li></ul></ul>
    42. 42. Streams <ul><li>Set context </li></ul><ul><li>Info kommer </li></ul>
    43. 43. Normalisering <ul><li>Är ”ö” ett eller två tecken? </li></ul><ul><ul><li>o + ¨ </li></ul></ul><ul><li>Skall a och â och á och à betraktas som samma tecken eller skilda tecken? </li></ul><ul><li>Normalisering är den process som svarar på dessa frågor, och liknande. </li></ul><ul><li>Text bör normaliseras innan man lagrar, sorterar eller gör andra slags jämförelser. </li></ul><ul><li>När? ”Filter input” </li></ul><ul><li>http://docs.php.net/manual/en/class.normalizer.php </li></ul>
    44. 44. Böcker <ul><li>Building Scalable Webistes </li></ul><ul><ul><li>Cal Hendersson; Sebastopol, CA; USA: O'Reilly , 2006. </li></ul></ul><ul><ul><li>ISBN: 978-0-596-10235-7 </li></ul></ul><ul><ul><li>Se speciellt kapitel 4, som har en kortkurs om tecken och kapitel 5, som talar om säkerhet och dataintegritet också ur denna aspekt </li></ul></ul><ul><li>Fonts and Encodings </li></ul><ul><ul><li>Yannis Haralambous; Sebastopol, CA; USA: O'Reilly , 2007. </li></ul></ul><ul><ul><li>ISBN: 978-0-596-10242-5 </li></ul></ul><ul><li>Unicode Explained </li></ul><ul><ul><li>Jukka K. Korpela; Sebastopol, CA; USA: O'Reilly , 2006. </li></ul></ul><ul><ul><li>ISBN: 978-0-596-10121-X </li></ul></ul>
    45. 45. Webbplatser <ul><li>The Official Unicode site </li></ul><ul><li>Wikipedia, flera artiklar, däribland: </li></ul><ul><ul><li>ASCII </li></ul></ul><ul><ul><li>Character Encoding </li></ul></ul><ul><ul><li>Unicode </li></ul></ul><ul><ul><li>Western Latin Character sets (computing) </li></ul></ul><ul><li>http://blog.whatwg.org/meta-charset </li></ul><ul><li>http://w3.org/international/O-HTTP-charset </li></ul><ul><li>http://httpd.apache.org/docs </li></ul><ul><li>http://php.net </li></ul><ul><li>http://talks.php.net/show/php6-unicode-froscon </li></ul><ul><li>http://gravitonic.com/talks (Andrei Zmievski, mannen som gjort det mesta(?) för att PHP skall stöda Unicode) </li></ul>

    ×