Teckenkodning Pa Webben Pt 2
Upcoming SlideShare
Loading in...5
×
 

Teckenkodning Pa Webben Pt 2

on

  • 5,393 views

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ö

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ö

Statistics

Views

Total Views
5,393
Slideshare-icon Views on SlideShare
5,356
Embed Views
37

Actions

Likes
1
Downloads
10
Comments
2

2 Embeds 37

http://keryx.se 30
http://www.slideshare.net 7

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

12 of 2

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Teckenkodning Pa Webben Pt 2 Teckenkodning Pa Webben Pt 2 Presentation Transcript

  • 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ö
  • ” 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.
  • 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
  • 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
  • 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
  • ” Ö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
  • ” Ö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=
  • 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
  • Användningsplatser
  • I webbläsaren
  • 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
  • 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
  • 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
  • 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.
  • 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
  • Från webbläsaren
  • 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
  • PHP internt
  • 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)
  • 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()
  • 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
  • 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
  • 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!
  • ” Ö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
  • 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
  • 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 ');
    • }
  • 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!
  • 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( ' עברית ' );
  • 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
  • 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!
  • 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.
  • 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>]
  • 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
  • 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
  • PHP strömmar och sockets
  • 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?
  • MySQL
  • 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
  • Skriva och läsa filer
  • ” File sockets”
    • Info kommer…
  • ” 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!
  • Streams
    • Set context
    • Info kommer
  • 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
  • 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
  • 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)