Transcript
Page 1: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.2. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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 enLAMP-miljö

Page 2: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

”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.

Page 3: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 4: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 5: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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änderintervallet 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

Page 6: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

”Ö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

Page 7: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

”Ö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=

Page 8: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 9: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Användningsplatser

Databas Textfil, ev. i XML-format

Webbtjänst,andra servrar,andra program

PHP

Apache(eller IIS...)

StrömmarSockets

Lagring

HTTP

(X)HTMLCSSJ avaskriptEtc

Page 10: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

I webbläsaren

Databas Textfil, ev. i XML-format

Webbtjänst,andra servrar,andra program

PHP

Apache(eller IIS...)

StrömmarSockets

Lagring

HTTP

(X)HTMLCSSJ avaskriptEtc

Page 11: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Hur webbläsaren tolkar HTML

1. 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!

2. 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!!!

3. Titta på meta-elementet i HTML-koden Kräver att teckenkodningen är ASCII-kompatibel

4. Default: iso-8859-1

Page 12: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Hur webbläsaren tolkar äkta XHTML

Vad menas?– Data sänd som application/xhtml+xml– Filändelsen xhtml– Internet Explorer kan inte XHTML!

1. HTTP-huvud2. BOM3. Titta på XML-prologen4. Default: UTF-8

Page 13: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 14: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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ändelseaddCharset EUC-JP .eucaddCharset 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.

Page 15: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 16: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Från webbläsaren

Databas Textfil, ev. i XML-format

Webbtjänst,andra servrar,andra program

PHP

Apache(eller IIS...)

StrömmarSockets

Lagring

HTTP

(X)HTMLCSSJ avaskriptEtc

Page 17: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 18: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

PHP internt

Databas Textfil, ev. i XML-format

Webbtjänst,andra servrar,andra program

PHP

Apache(eller IIS...)

StrömmarSockets

Lagring

HTTP

(X)HTMLCSSJ avaskriptEtc

Page 19: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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)

Page 20: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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()

Page 21: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 22: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 23: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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!

Page 24: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

”Ö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

Page 25: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 26: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Exkurs, forts: Ta bort Magic Quotes

if ( ini_get('magic_quotes_sybase') ) {// Mycket ovanlig databastrigger_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');

}

Page 27: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Multibyte-funktioner

PHP kan redan använda Unicode– Detta funkar idag (PHP 5):

function säg_hebreiska() { echo 'עברית';}function säg_arabiska() { echo ' بْي9 ;' َع>َر>}

Svårigheten är att skriva tecknen på ett latinskt tangentbord!

Page 28: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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 motsvarandemulti-byte funktion

– Detta funkar:echo mb_strlen('עברית');

Page 29: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 30: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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!

Page 31: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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.

Page 32: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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>]

Page 33: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 34: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 35: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Databas Textfil, ev. i XML-format

Webbtjänst,andra servrar,andra program

PHP

Apache(eller IIS...)

StrömmarSockets

Lagring

HTTP

(X)HTMLCSSJ avaskriptEtc

PHP strömmar och sockets

Page 36: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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?

Page 37: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Databas Textfil, ev. i XML-format

Webbtjänst,andra servrar,andra program

PHP

Apache(eller IIS...)

StrömmarSockets

Lagring

HTTP

(X)HTMLCSSJ avaskriptEtc

MySQL

Page 38: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 39: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Databas Textfil, ev. i XML-format

Webbtjänst,andra servrar,andra program

PHP

Apache(eller IIS...)

StrömmarSockets

Lagring

HTTP

(X)HTMLCSSJ avaskriptEtc

Skriva och läsa filer

Page 40: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

”File sockets”

Info kommer…

Page 41: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

”File sockets” i PHP 6

PHP 5– Öppna alltid binärt, såvida du inte vill på windows

system konvertera \n till \r\n– 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!

Page 42: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

Streams

Set context Info kommer

Page 43: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 44: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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

Page 45: Teckenkodning Pa Webben Pt 2

Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]

© Lars Gunther. All rights reserved.

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)