php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 04-10-2014, 20:09
narutos
 Registrierter Benutzer
Links : Onlinestatus : narutos ist offline
Registriert seit: Sep 2014
Beiträge: 23
narutos befindet sich auf einem aufstrebenden Ast
Standard multibyte-Vergleiche

Hallo

In Java ist es bei ASCII-Zeichen erlaubt, die Zeichen mittels z. B. < oder > zu vergleichen, weil im Hintergrund die ASCII-Zeichen verglichen werden. Doch wie schaut das in PHP und UTF-8 aus?

Ich habe schon etwas herumexperimentiert ... und wurde überrascht.

PHP-Code:
<?php
   error_reporting
(-1);
   
   
mb_internal_encoding('UTF-8');
   
   
var_dump('I' 'Y');  // 49 < 59 => true OK
   
var_dump('IZ' 'Y'); // 49, 5a < 59 => true OK
   
var_dump('§' 'µ');  // c2a7 < c2b5 => true OK
   
var_dump('§' 'µ');  // c2a7 > c2b5 => false OK
?>
Interessanterweise kommt überall die richtige Ausgabe, so wie ich es erhofft hatte.

Allerdings hätte ich eigentlich vermutet, dass das gar nicht geht, dass man so gar keine UTF-8-Zeichen vergleichen darf. Ich hätte eigentlich vermutet, dass nur byteweise verglichen wird (immer nur das erste Byte der beiden Zeichen). Dann hätte der dritte var_dump false ausgeben müssen, da die ersten Bytes der beiden Zeichen § und µ gleich sind.

Also darf man das offiziell so machen? Darf man in PHP UTF-8-Zeichen mit < und > vergleichen?

Backgroundinfo: es interessiert mich wegen dem hier: http://www.unistreams.de/vorlesungen...4-kapitel-3-1/ ab Minute 53 (ich kann übrigens alle Vorlesungen dieses Profs empfehlen, der ist gut )

Geändert von narutos (04-10-2014 um 20:20 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 04-10-2014, 20:23
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

PHP kann kein UTF-8. Strings werden wie Byte-Arrays behandelt.
Mit Zitat antworten
  #3 (permalink)  
Alt 04-10-2014, 21:13
narutos
 Registrierter Benutzer
Links : Onlinestatus : narutos ist offline
Registriert seit: Sep 2014
Beiträge: 23
narutos befindet sich auf einem aufstrebenden Ast
Standard

Ok, also nachdem das jetzt schon das zweite Thema ist, in dem du spamst und du auch nicht aufhörst, obwohl ich dich schon gebeten habe, muss ich das jetzt melden. PHP kann sehr wohl UTF-8, das beweist schon alleine der mb_internal_encoding-Funktionsaufruf.

Geändert von narutos (04-10-2014 um 21:32 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 04-10-2014, 21:33
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Ist jetzt vielleicht etwas off-topic, aber du könntest vielleicht mal diese beiden Leute irgendwie kontaktieren:

- veryhot (php.de)
- kudlimudli (phpforum.de, hat glaube ich auch noch andere Accounts)

(Müsstest dir dazu dort vermutlich jeweils einen Account erstellen.)

Die beschäftigen sich mit sehr ähnlichen Themen wie du (etwa Vornberger-Vorlesungen). Vielleicht könnt ihr euch untereinander austauschen und dann auch Rechercheaufgaben unter euch aufteilen oder dergleichen. Ich denke, das wäre für euch alle ganz fruchtbar.

Nur eine wilde Idee.
Mit Zitat antworten
  #5 (permalink)  
Alt 04-10-2014, 21:35
narutos
 Registrierter Benutzer
Links : Onlinestatus : narutos ist offline
Registriert seit: Sep 2014
Beiträge: 23
narutos befindet sich auf einem aufstrebenden Ast
Standard

Also ich finde, irgendwie macht das der Prof etwas umständlich. Zuerst prüft er in der Schleife, danach nochmals nach der Schleife. Spricht was dagegen, die Kontrollen ausschließlich nur in der Schleife durchzuführen?
PHP-Code:
<?php
   error_reporting
(-1);
   
   
mb_internal_encoding('UTF-8');
   
   
/*var_dump('I' < 'Y');  // 49 < 59 => true OK
   var_dump('IZ' < 'Y'); // 49, 5a < 59 => true OK
   var_dump('§' < 'µ');  // c2a7 < c2b5 => true OK
   var_dump('§' > 'µ');  // c2a7 > c2b5 => false OK
   */
   
   
class MbString
   
{
      private 
$text;
      
      function 
__construct($text)
      {
         
$this->text $text;
      }
      function 
cmp(MbString $other)
      {
         
$thisLen mb_strlen($this->text);
         
$otherLen mb_strlen($other->text);
         for(
$i 0; ; ++$i)
         {
            if(
$i >= $thisLen)
               return 
$i >= $otherLen : -$i;
            if(
$i >= $otherLen)
               return 
$i;
            if(
mb_substr($this->text$i1) != mb_substr($other->text$i1))
               return 
mb_substr($this->text$i1) < mb_substr($other->text$i1) ? -$i $i;
         }
      }
   }
   
   
$otherS = new MbString('ab');
   
   
$thisS = new MbString('a');
   
var_dump($thisS->cmp($otherS)); // this < other => -1
   
   
$thisS = new MbString('abc');
   
var_dump($thisS->cmp($otherS)); // this > other => 2
   
   
$thisS = new MbString('ab');
   
var_dump($thisS->cmp($otherS)); // this = other => 0
   
   
$thisS = new MbString('aa');
   
var_dump($thisS->cmp($otherS)); // this < other => -1
   
   
$thisS = new MbString('ax');
   
var_dump($thisS->cmp($otherS)); // this > other => 1
?>
Ich gehe hier einfach mal davon aus, dass es in PHP offiziell erlaubt ist, dass man Multibyte-Zeichen per < und > vergleichen darf.

Soviel ich weiß, macht der Vornberger mehrere unterschiedliche Vorlesungen. Und es gibt auch mehrere Professoren, die so ähnliche Vorlesungen halten. Das wäre schon ein Zufall, wenn ich vom gleichen Prof die gleiche Vorlesung erwischt hätte. Das Problem ist ja auch, dass jeder Prof ganz anders unterrichtet. Der Vornberger hat das Thema Floatingpoint-Kodierung z. B. nur sehr rudimentär angesprochen - erwähnt er auch selbst im Vortrag. Andere Profs erklären z. B. auch die unterschiedlichen Rundungsalgorithmen. Und auch die Beispiele sind sicher bei allen Profs ganz unterschiedlich.

Wie schaut meine Vergleichsvariante aus ?

Geändert von narutos (04-10-2014 um 21:57 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 04-10-2014, 21:46
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von narutos Beitrag anzeigen
Ok, also nachdem das jetzt schon das zweite Thema ist, in dem du spamst und du auch nicht aufhörst, obwohl ich dich schon gebeten habe, muss ich das jetzt melden. PHP kann sehr wohl UTF-8, das beweist schon alleine der mb_internal_encoding-Funktionsaufruf.
Ich weiß nicht, welches Problem du hast. Fakt ist, dass PHP keine Multi-Byte-Strings unterstützt und dass über dessen Einführung schon jahrelang Debatten geführt werden - ohne Ergebnis.

Auch die genannten mb_* Funktionen sind nur Workarounds, die mit Byte-Arrays arbeiten.

Zitat:
Zitat von narutos Beitrag anzeigen
Wie schaut meine Vergleichsvariante aus?
Schlecht, da du nur Bytes und keine Multi-Byte-Strings vergleichst.

Mal davon abgesehen, dass der Code generell nicht funktioniert, weil cmp() in dem Fall immer 0 liefert:

PHP-Code:
$values array_merge(range(09), range('A''Z'), range('a''z'), ['Ä''Ö''Ü''ä''ö''ü''ß']);

usort($values, function ($a$b) {
    return (new 
MbString($a))->cmp(new MbString($b));
});
echo 
implode($values);
// lkjmnpoihcbadegfqrÜÖÄäößüzytsuvxwZYCBADEGF983214576HITSRUVXWQPKJLMON0 

Geändert von h3ll (04-10-2014 um 22:13 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 24-10-2014, 12:46
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von narutos Beitrag anzeigen
In Java ist es bei ASCII-Zeichen erlaubt, die Zeichen mittels z. B. < oder > zu vergleichen, weil im Hintergrund die ASCII-Zeichen verglichen werden.
Nein. Java-Strings bestehen aus Unicode-"Zeichen"-Sequenzen (normalerweise intern als UTF-16 kodiert). Die gehen über ASCII weit hinaus. Wie die Java-Vergleichsoperatoren mit solchen Strings umgehen, entzieht sich meiner Kenntnis. Aber höchstwahrscheinlich vergleichen sie nur Codepoints, keine Graphem-Cluster (wie es ein menschlicher Leser tun würde).

Außerdem dürften sie keine Collation-Sequences kennen, d.h. das Vergleichen nach bestimmten Regeln (bspw. wie in Telefonbüchern oder Wörterbüchern). Die sind nämlich von der Sprache und teilweise sogar vom Land abhängig.

Java nutzt für diese Zwecke die Funktionen der ICU-Libraries.

Zitat:
Doch wie schaut das in PHP und UTF-8 aus?
PHP kann ASCII-Byte-Sequenzen vergleichen. Je nachdem, mit welcher Lokalisierung dein PHP compiliert wurde, kann es auch 8-Bit-Zeichensätze, die über ASCII hinausgehen vergleichen. Das war es auch schon. H3ll hat recht. Deal with it.

Es gibt allerdings Erweiterungen für PHP, die beschränkt mit anderen Kodierungen umgehen können. Die Multibyte-Extension kann mit vielen verschiedenen Kodierungen außerhalb des ASCII|8-Bit-Bereiches arbeiten. Vergleichsfunktionen oder Collation-Sequences kennt sie aber nicht.

Die "intl"-Erweiterung basiert auf ICU und nutzt zu einem Großteil die Java-APIs. Das ist gut, weil man so die Java-API-Dokumentation zu Rate ziehen kann. Die PHP-Dokumentationen sind derzeit nahezu unbrauchbar. Außerdem hängt die Funktionalität stark von der PHP-Version ab (es kommt ständig was hinzu).

"Intl" besitzt eigene Funktionen für String-Vergleiche und zum Erzeugen von Vergleichsschlüsseln falls du dir deine Vergleichsfunktionen selbst basteln möchtest.

Zitat:
Ich habe schon etwas herumexperimentiert ... und wurde überrascht.

PHP-Code:
<?php
   error_reporting
(-1);
   
   
mb_internal_encoding('UTF-8');
   
   
var_dump('I' 'Y');  // 49 < 59 => true OK
   
var_dump('IZ' 'Y'); // 49, 5a < 59 => true OK
   
var_dump('§' 'µ');  // c2a7 < c2b5 => true OK
   
var_dump('§' 'µ');  // c2a7 > c2b5 => false OK
?>
Interessanterweise kommt überall die richtige Ausgabe, so wie ich es erhofft hatte.
Hüh? Klar kommt die "richtige" Ausgabe. UTF-8-Byte-Sequenzen wurden extra so konstruiert, um herkömmliche 8-Bit-String-Vergleichsfunktionen nicht zu verwirren.

Nebenbei gibt es noch ein weiteres Problem: Die interne Kodierung von PHP-String-Literale in einfachen Hochkommas hängt vom verwendeten Editor ab. Da du nur Zeichen aus dem 8-Bit-Bereich verwendet hast, sagt dein Quelltext gar nichts darüber aus, ob das Zeichen '§' jetzt intern als 0x87 (ISO-Latin-1) oder 0xC2 0xA7 (UTF-8) kodiert wurde. Probiere das mit Codepoints > 0xFF und du wirst vielleicht einige Überraschungen erleben.

Zitat:
Allerdings hätte ich eigentlich vermutet, dass das gar nicht geht, dass man so gar keine UTF-8-Zeichen vergleichen darf. Ich hätte eigentlich vermutet, dass nur byteweise verglichen wird (immer nur das erste Byte der beiden Zeichen). Dann hätte der dritte var_dump false ausgeben müssen, da die ersten Bytes der beiden Zeichen § und µ gleich sind.
Nein. Versuche, die interne Arbeitsweise von String-Vergleichsfunktionen zu verstehen, am besten am Quellcode von strcmp()-, memcmp()-Funktionen in C-Quellcode (bpsw. in den PHP-Sources). Dann wirst du sehen, dass deine Vermutung nicht korrekt ist.

Zitat:
Also darf man das offiziell so machen? Darf man in PHP UTF-8-Zeichen mit < und > vergleichen?
Ja. PHP-Strings sind nichts anderes als in der Länge veränderbare Byte-Arrays. Genauso werden sie von den (meisten) PHP-Stringfunktionen (der Standard-Library) auch behandelt. Die Vergleichsoperatoren tun das ebenfalls. Ob die Bytes jetzt ASCII, ISO-Latin-1, UTF-8 oder was auch immer darstellen, ist denen wurst. Sie vergleichen Byte für Byte. UTF-8 ist so konstruiert, dass solche dummen Funktionen oder Operatoren trotzdem "funktionieren". Das ist eine Eigenschaft von UTF-8, aber nicht von PHPs String-Funktionen/-Operatoren.

Zitat:
Backgroundinfo: es interessiert mich wegen dem hier: Unistreams Algorithmen WS 2013/14 - Kapitel 3.1 - Unistreams ab Minute 53 (ich kann übrigens alle Vorlesungen dieses Profs empfehlen, der ist gut )
Zitat:
Inhalt dieser Vorlesung:

In der Vorlesungsreihe “Algorithmen” werden anhand der Programmiersprache Java Algorithmen zum Suchen und Sortieren vorgestellt und die dazu benötigten Datenstrukturen wie Keller, Schlange, Liste, Baum und Graph eingeführt. Programme werden auf Eigenschaften wie Korrektheit, Terminierung und Effizienz untersucht.
Mag sein, dass der Mann in Theoretischer Informatik und auch ein wenig in "Algorithmen und Datenstrukturen" gut ist. Mit Textverarbeitung und Unicode-Problemen hat das aber nicht viel zu tun.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
vergleiche anstellen jeichi SQL / Datenbanken 5 13-09-2012 12:31
[PHP] Multibyte-taugliches wordwrap? Quetschi Apps und PHP Script Gesuche 18 31-08-2012 11:05
[Funktion] DB-Abfrage mit PHP vergleiche Level7 PHP Developer Forum 2 20-08-2008 15:20
Erledigt! Vergleiche auch ohne WHERE möglich? Truncate Archiv / Trash 0 28-02-2006 20:30
Bit-Vergleiche in PHP? KaZaK PHP Developer Forum 2 28-09-2003 12:44

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:17 Uhr.