Teckenkodning Pa Webben Pt 2

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

3 comments

Comments 1 - 3 of 3 previous next Post a comment

  • + guesta39ad8 guesta39ad8 2 years ago
    @mobil: Jag vet, men har inte haft tid att åtgärda.
  • + mobil Mikael O. Bonnier 2 years ago
    Sidan 9 saknar åäö och har blanka där i stället.
  • + itpastorn itpastorn 2 years ago
    This is a work in progress and in Swedish.

    Detta är min första presentation här. Jag hoppas kunna dela upp den och förse den med ljud i dess färdiga form.

Post a comment
Embed Video
Edit your comment Cancel

1 Favorite

Teckenkodning Pa Webben Pt 2 - Presentation Transcript

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

+ itpastornitpastorn, 2 years ago

custom

2762 views, 1 favs, 1 embeds more stats

In Swedish. En genomgång av hur man behöver förh more

More info about this document

© All Rights Reserved

Go to text version

  • Total Views 2762
    • 2737 on SlideShare
    • 25 from embeds
  • Comments 3
  • Favorites 1
  • Downloads 10
Most viewed embeds
  • 25 views on http://keryx.se

more

All embeds
  • 25 views on http://keryx.se

less

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

Cancel
File a copyright complaint
Having problems? Go to our helpdesk?

Categories