Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Verwendung von UTF-8    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
Teralios
Moderator
Perfekter User


Dabei seit: 18.09.2005
Herkunft: Berlin
Posts: 2542
     Verwendung von UTF-8 Zitat | Bearbeiten

Da hier im Forum bereits öfters die Frage nach UTF-8 kommt, werde ich versuchen euch einige Grundlagen, was den Umgang mit UTF-8 angeht, bei zu bringen.
1. Das Script
Das Script könnt ihr einfach weiter so benutzen wie bisher. Hier ist aber nun Entscheident, das ihr eine Funktion braucht, die euch klar Anzeigt, ob ein String UTF-8 kodiert ist, oder nicht. Folgende Funktion tut dies:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
<?php
function is_utf8($string) {
        
/*return preg_match('/^(
                [\x09\x0A\x0D\x20-\x7E]*        # ASCII
            |    [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
            |    \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
            |    [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}    # straight 3-byte
            |    \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
            |    \xF0[\x90-\xBF][\x80-\xBF]{2}        # planes 1-3
            |    [\xF1-\xF3][\x80-\xBF]{3}        # planes 4-15
            |    \xF4[\x80-\x8F][\x80-\xBF]{2}        # plane 16
            )*$/x', $string);
        */    
        
return preg_match('/(
                [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
            |    \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
            |    [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}    # straight 3-byte
            |    \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
            |    \xF0[\x90-\xBF][\x80-\xBF]{2}        # planes 1-3
            |    [\xF1-\xF3][\x80-\xBF]{3}        # planes 4-15
            |    \xF4[\x80-\x8F][\x80-\xBF]{2}        # plane 16
            )/x'
$string);
    }
?>

Desweiteren ist der Umgang mit HTMLENTITES und HTMLSPECIALCHARS nicht mehr so einfach wie vorher. Hier zu könnt ihr die Funktion in folgenden Formen aufrufen:
 PHP 
1:
2:
3:
4:
<?php
htmlspecialchars
($stringENT_COMPAT'UTF-8');
htmlentities($stringENT_COMPAT'UTF-8');
?>

Auch greifen die Stringfunktionen von PHP nicht mehr fehlerfrei, da UTF-8 auf Unicode basiert, und somit ein Zeichen nicht nur ein Byte haben kann. Hierfür gibt es nun die MultiBytefunktionen aus der MB-Bibliothek. Desweiteren kommen Funktionen für UTF-8 kodierung und decodeierung hinzu. (utf8_decode & utf8_encode)
 PHP 
1:
2:
3:
4:
<?php
$newstring 
utf8_decode($string)
$newstring utf8_encode($string)
?>

Diese Greifen aber nur bei ISO-8859-1 und UTF-8 . Für andere kodierungen zu UTF-8 sollte man die Funktion mb_convert_encoding benutzen.
 PHP 
1:
2:
3:
<?php
$string 
mb_convert_encoding($string$to$from);
?>

Somit wäre das Script abgedeckt.
2. Die Homepage
Fehler entstehen meistens hier, wenn Daten übergeben werden. Diesen könnt ihr einfach vorbeugen wenn ihr:
 Code 
1:
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
Sowie bei der erste getätigten Ausgabe:
 PHP 
1:
2:
<?php
header
('Content-Type: text/html; charset=UTF-8');?>

sendet. Damit wären hier Fehler bereits ausgeschlossen.
3. Die Datenbank
Hier liegt auch oft ein Fehler. UTF-8 wird erst von einer mySQL-Version erst ab 4.1+ fehlerfrei unterstützt. Hier solltet ihr für Verbindung, und Tabellen meist folgende Kodierung fehlen:
utf8_unicode_ci oder utf8_bin. Zudem, wie gesagt, sollte die Verbindung von PHP zu mySQL und zurück auf UTF-8 zurückgreifen. Solltet ihr euch da nicht sicher sein, wirkt ein einfaches SQL-Query
 Code 
1:
SET NAMES 'utf-8'

So, das ist somit das wichtigste zu UTF-8 und dürfte euch weiter helfen.
Bei Fragen stehe ich soweit ich kann gerne zu verfügnung, möchte aber auch bitten, das ich nicht zu jeden Problem die Lösung weiß. Wenn hier die Tipps hier beachtet, dürfte es aber keine bis kaum Probleme geben.




Post wurde schon 10x editiert, das letzte mal am 18.08.2007 um 08:51 von Teralios
17.08.2007, 13:31 Profil | PM | E-Mail  
Mr. Apple
Mitglied
Guter User


Dabei seit: 17.09.2007
Herkunft:
Posts: 309
      Zitat | Bearbeiten

wie kommts, dass Euro-Zeichen in Fragezeichen gesetzt werden?

alles weiter klappt

edit: und wieso nehmen so wenig seiten UTF-8?
Gibts da viele Nachteile oder so?


du bist so behindert, dass Leute aus dem Rollstuhl aufstehen um dich zu schieben...

Post wurde schon 1x editiert, das letzte mal am 01.10.2008 um 16:23 von Mr. Apple
01.10.2008, 12:35 Profil | PM | E-Mail  
Teralios
Moderator
Perfekter User


Dabei seit: 18.09.2005
Herkunft: Berlin
Posts: 2542
      Zitat | Bearbeiten

? => Zeichen unbekannt! Warum, k.a eigentliuch sollte das € in UTF-8 vorhanden sein, was aber sein kann, ist das der eigentliche Text nicht als UTF-8 abgesendet wurde und dadurch diese Probleme auftretten!

Warum UTF-8 so selten verwendet wird, wird es garnicht. Nachteile gibt es zwar: Mehr Speicherplatz. Der Vorteil ist aber, das jedes verdammte Zeichen unterstützt wird!


05.10.2008, 09:30 Profil | PM | E-Mail  
Meila
Mitglied
Neuling


Dabei seit: 14.10.2008
Herkunft: keine Angabe
Posts: 8
     ?? Zitat | Bearbeiten

Hallo

Find ich super, dass du es versuchst zu erklären, aber sag mal, was machen denn diese zwei oberen Funktionen mit den ganzen [x... genau? Wozu genau sind die da? Warum kann man da nicht htmlentities() nehmen?

Meila




21.10.2008, 10:33 Profil | PM | E-Mail  
Teralios
Moderator
Perfekter User


Dabei seit: 18.09.2005
Herkunft: Berlin
Posts: 2542
      Zitat | Bearbeiten

Zitat:
Das Script könnt ihr einfach weiter so benutzen wie bisher. Hier ist aber nun Entscheident, das ihr eine Funktion braucht, die euch klar Anzeigt, ob ein String UTF-8 kodiert ist, oder nicht. Folgende Funktion tut dies:

Prüft ob ein String UTF8 Kodierung enthält oder nicht.


21.10.2008, 18:53 Profil | PM | E-Mail  
delix
Mitglied
Guter User


Dabei seit: 10.06.2007
Herkunft: schlumpfenwald
Posts: 339
      Zitat | Bearbeiten

hallo, zum teil nimmt es ä und ü nicht an was ist das problem?


 PHP 
1:
2:
3:
4:

<?php
echo "Ich bin keine Signatur. Ich putze hier nur  ";
?>
21.12.2008, 12:37 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Hello

Eine (wahrscheinlich) ganz dumme Frage :

Für was brauch ich UTF-8 ?

Bitte um Antwort.


Lg Christian


04.03.2009, 18:42  
Teralios
Moderator
Perfekter User


Dabei seit: 18.09.2005
Herkunft: Berlin
Posts: 2542
      Zitat | Bearbeiten

UTF-8 ist eine andere Zeichenkodierung, die zur Familie der Unicode Zeichenkodierung gehört. Es ermöglicht mehr Zeichen als z.b ISO-8859-1 zu speichern und zu nutzen. Dabei lohnt sich die Verwendung nur dann, wenn man wirklich wenn man z.b Franzöisch, Deusch, Arabisch usw. in derSeite verwenden möchte. Benötigt man z.b aber nur Deutsch, ist es besser man nutzt ISO-8859-15


08.03.2009, 21:35 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Hallo

wie soll das mit dem "einfachen" SQL-Query funktionieren ?

DS


01.09.2009, 19:01  
FalkenaugeMihawk
Mitglied
Perfekter User


Dabei seit: 05.06.2010
Herkunft: Schweiz
Posts: 2619
      Zitat | Bearbeiten

Eine Frage dazu in Zusammehang mit MySQL: Ist es normal, dass wenn man "&#65288;&#9583;°&#9633;°&#65289;&#9583;&#65077; &#9531;&#9473;&#9531;" (siehe Link) in der DB speichert (z.B. über PHP), dass bei einem Feld mit dem Typ text "(╯°□°)╯︵ ┻━┻" drin steht und bei varchar dann das was man gespeichert hat?

edit: Leider funktioniert das hier nicht so gut... hier sieht mans: http://falkenauge.mph-p.de/unicode.php




Post wurde schon 2x editiert, das letzte mal am 25.11.2012 um 01:45 von FalkenaugeMihawk
25.11.2012, 01:43 Profil | PM | E-Mail  
Teralios
Moderator
Perfekter User


Dabei seit: 18.09.2005
Herkunft: Berlin
Posts: 2542
      Zitat | Bearbeiten

Das hab ich ehrlich gesagt noch nie getestet, ob Entities umgewandelt werden.

Mir erschließt sich aber nicht ganz der Sinn, warum du die Schriftzeichen als Entitites speicher willst.


25.11.2012, 10:24 Profil | PM | E-Mail  
FalkenaugeMihawk
Mitglied
Perfekter User


Dabei seit: 05.06.2010
Herkunft: Schweiz
Posts: 2619
      Zitat | Bearbeiten

Zitat:
Orginal von GameR
Das hab ich ehrlich gesagt noch nie getestet, ob Entities umgewandelt werden.

Mir erschließt sich aber nicht ganz der Sinn, warum du die Schriftzeichen als Entitites speicher willst.

Tu ich auch nicht, das ist das Command Board, das dies so macht. Ich hab nen Link angefügt und dort sieht man die Zeichen die ich meine. Diese werden in einem Feld mit dem Typ text umgewandelt - aber dann doch richtig angezeigt. Bei einem Feld mit dem Typ varchar werden die Zeichen genau so eingetragen, wie sie reinkommen.

edit: Ich hab jetzt mal ein Script geschrieben, dass es besser veranschaulicht:
 PHP 
1:
Input: Wie du siehst, ist hier nichts. &#65288;&#9583;°&#9633;°&#65289;&#9583;&#65077; &#9531;&#9473;&#9531; / Field type feld: Wie du siehst, ist hier nichts. ??°?°??? ??? / Field type varchar: Wie du siehst, ist hier nichts. &#65288;&#9583;°&#9633;°&#65289;&#9583;&#65077; &#9531;&#9473;&#9531;


Diese Entities kommen von Command Board. Wenn man meinen geposteten Link öffnet, werden die Zeichen, die ich zurzeit meine, korrekt ausgegeben.




Post wurde schon 2x editiert, das letzte mal am 25.11.2012 um 17:23 von FalkenaugeMihawk
25.11.2012, 13:23 Profil | PM | E-Mail  
Seiten (1):  1 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Verwendung von UTF-8   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz