Teckenkodning Pa Webben Pt 2
-
Upload
lars-gunther -
Category
Technology
-
view
3.790 -
download
1
description
Transcript of 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ö
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.
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
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
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
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
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=
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
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
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
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
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
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
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.
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
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
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
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
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)
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()
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
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
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!
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
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
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');
}
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!
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('עברית');
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
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!
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.
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>]
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
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
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
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?
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
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
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
Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]
© Lars Gunther. All rights reserved.
”File sockets”
Info kommer…
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!
Version: Alfa 0.1. Skicka förslag på förbättringar till [email protected]
© Lars Gunther. All rights reserved.
Streams
Set context Info kommer
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
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
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)