Unicode enzo

Door , 3 jaar geleden, 7.622x bekeken

Voor iedere PHP-er, wat nou precies de problemen zijn met vreemde tekens en hoe die definitief op te lossen.

Gesponsorde koppelingen

Inhoudsopgave

  1. Inleiding
  2. Over Unicode
  3. PHP en UTF-8
  4. Tekstbestanden
  5. Databases
  6. Overige in- en uitvoer
  7. Verwerking in PHP
  8. Conclusie

 

Er zijn 4 reacties op 'Unicode enzo'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Pim -
Pim -
3 jaar geleden
 
Ziet er degelijk uit! Misschien kan je ook nog toevoegen hoe met UTF omgaat met PDO icm MySQL, aangezien dat - naar ik aanneem - veel gebruikt wordt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$dsn
= 'mysql:host=localhost;dbname=testdb';
$username = 'username';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);


$dbh = new PDO($dsn, $username, $password, $options);
?>

Bron: https://secure.php.net/manual/en/ref.pdo-mysql.connection.php
Martin -
Martin -
3 jaar geleden
 
Vóór PHP 5.3.6 was SET NAMES utf8 nodig. Inmiddels kan dit in de DSN worden meegenomen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$dsn
      = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$username = 'username';
$password = 'password';

$dbh = new PDO($dsn, $username, $password);
?>


Het voordeel hiervan is dat PDO::MYSQL_ATTR_INIT_COMMAND beschikbaar blijft om bijvoorbeeld de MySQL-mode correct in te stellen.

P.s. De ?> is uiteraard overbodig, maar de code-blokken werken hier niet zonder de afsluitende tag :(


3 jaar geleden
 
0 +1 -0 -1
Twee kleine details om rekening mee te houden die ik nog niet heb genoemd zijn:

1.) ook URL's hebben een encoding, namelijk UTF-8...

"Niet US-ASCII karakters moeten eerst getranscodeerd naar UTF-8, en vervolgens moet elk octet van de encoding weer met procenten getranscodeerd worden."
Zie : http://tools.ietf.org/html/rfc3986

In PHP moet je er dus rekening mee houden dat URL's voor gebruik van urlencode() en na gebruik van urldecode() de UTF-8 karakter encoding hebben(!)

2.) Als je downloadlinkjes maakt met een 'Content-Disposition' HTTP header, dan MOET de bestandsnaam in het 'filename'-attribuut de ISO-8859-1 encoding hebben.
Echter, inmiddels ZOU je het 'filename*' attribuut MOETEN gebruiken, met een waarde die begint met utf-8'' en vervolgens de bestandsnaam in UTF-8, net zoals dat met URL's gaat.
Bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Content-Disposition: attachment;
  filename="EURO rates";
  filename*= UTF-8''%e2%82%ac%20rates

Zie: http://tools.ietf.org/html/rfc6266
Het oude 'filename' attribuut is bedoeld als fallback voor antieke browsers die nieuwe syntax uit 2011 nog niet herkennen.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


3 jaar geleden
 
0 +1 -0 -1
Laatste aanvulling, als je het Engels machtig bent:
1. sla deze tutorial over, lees eerst http://kunststube.net/encoding
2. gebruik de Intl-extentie voor alle Unicode-bewerkingen
3. library-documentatie via http://site.icu-project.org
4. antwoorden op vragen zijn reeds gegeven op http://stackoverflow.com

De Intl-extentie is tevens veelzijdiger en sneller dan het native DateTime object van PHP.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.