Ungleiche Zeichenanzahl, obwohl String identisch ist
ebody
- php
- zeichencodierung
Hallo,
ich habe 2 identische Wörter die aus 2 verschiedenen Exceldateien stammen. Das Script liegt in einer Datei die UTF-8 ohne BOM kodiert ist. Wenn ich die beiden Wörter ausgeben lasse, werden für $strB 12 Zeichen angezeigt und für $strA 11, obwohl sie im Browser und auch im Quellcode identisch sind.
Das "Ö" verursacht den Unterschied, aber warum werden unterschiedlich viele Zeichen angezeigt?
$strA = "Ökologisch";
$strB = "Ökologisch";
$strA = mb_convert_encoding($strA, 'UTF-8');
$strB = mb_convert_encoding($strB, 'UTF-8');
var_dump($strA); // string(11) "Ökologisch"
var_dump($strB); // string(12) "Ökologisch"
$strA = "Ö";
$strB = "Ö";
$strA = mb_convert_encoding($strA, 'UTF-8');
$strB = mb_convert_encoding($strB, 'UTF-8');
var_dump($strA); // string(2) "Ö"
var_dump($strB); // string(3) "Ö"
Gruß ebody
Tach!
Das "Ö" verursacht den Unterschied, aber warum werden unterschiedlich viele Zeichen angezeigt?
Da musst du mal den Hex-Code analysieren. bin2hex() oder einfacher mit urlencode().
dedlfix.
Der Code zeigt einen Unterschied:
$strA = "Ö";
$strB = "Ö";
echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396
echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
Wie kann ich jetzt weiter vorgehen, damit die Strings wirklich identisch sind?
Gruß ebody
@@ebody
Der Code zeigt einen Unterschied:
$strA = "Ö"; $strB = "Ö"; echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396 echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
Und der Artikel Normalisierung in HTML und CSS sagt dir, was es damit auf sich hat.
Wie kann ich jetzt weiter vorgehen, damit die Strings wirklich identisch sind?
Erster Suchtreffer: The Normalizer class
LLAP 🖖
Tach!
Der Code zeigt einen Unterschied:
$strA = "Ö"; $strB = "Ö"; echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396 echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
Also ein Ö und ein O mit extra Pünktchen: ̈◌
Wie kann ich jetzt weiter vorgehen, damit die Strings wirklich identisch sind?
Die Verwendung von Apple-Produkten untersagen. Oder eine UTF-8-Normalisierung vornehmen. Wie oder ob letzteres in PHP geht, weiß ich aber nicht.
dedlfix.
Vielen Dank euch beiden, dass war sehr hilfreich! Folgendes Script habe ich verwendet und es gibt beide "Ö" identisch aus.
$strA = "Ö";
$strB = "Ö";
var_dump($strA); // string(2) "Ö"
var_dump($strB); // string(3) "Ö"
echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396
echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
// String normalisieren
$strA = normalizer_normalize( $strA, Normalizer::FORM_C );
$strB = normalizer_normalize( $strB, Normalizer::FORM_C );
var_dump($strA); // string(2) "Ö"
var_dump($strB); // string(2) "Ö"
Zuvor musste ich in der php.ini noch extension=php_intl.dll auskommentieren.
Gruß ebody
Hello,
danke für die ausführliche Rückmeldung.
Wäre es nicht zweckmäßiger, tatsächlich eine Instanz der Klasse zu erzeugen, wenn man sie öfter hintereinander benutzt? So wie ich das jetzt sehe, hast Du die Methode doch z. Zt. statisch aufgerufen, oder?
Zuvor musste ich in der php.ini noch extension=php_intl.dll auskommentieren.
Du meintest sicherlich "die Auskommentierung entfernen"?
Liebe Grüße
Tom S.
Hallo Tom,
ja genau, ich meinte eigentlich, dass ich das Zeichen ";" zum auskommentieren entfernt habe.
Gruß ebody
@@ebody
Der Code zeigt einen Unterschied:
Und dann gibt’s da noch Fonts, die auch einen Unterschied zeigen.
Kunst kommt von können, Ku¨nste eher nicht. ;-)
LLAP 🖖
Jetzt ist mir endlich klar, warum es in einer Buchstabensuppe keine Umlaute gibt.
Danke!
@@pl
Jetzt ist mir endlich klar, warum es in einer Buchstabensuppe keine Umlaute gibt.
Was mir immer noch nicht klar ist: warum es in Russisch Brot keine kyrillischen, sondern lateinische Buchstaben gibt.
LLAP 🖖
Hi,
Jetzt ist mir endlich klar, warum es in einer Buchstabensuppe keine Umlaute gibt.
Was mir immer noch nicht klar ist: warum es in Russisch Brot keine kyrillischen, sondern lateinische Buchstaben gibt.
Stimmt doch gar nicht.
Nur weil es nicht alle kyrillischen Zeichen gibt, sind das nicht "keine".
A B C E H K M O P T X sind üblicherweise dabei.
;-)
cu,
Andreas a/k/a MudGuard
@@MudGuard
Was mir immer noch nicht klar ist: warum es in Russisch Brot keine kyrillischen, sondern lateinische Buchstaben gibt.
Stimmt doch gar nicht.
Nur weil es nicht alle kyrillischen Zeichen gibt, sind das nicht "keine".
A B C E H K M O P T X sind üblicherweise dabei.
Ha, Г und И und Я ja auch. Nur die Glasur ist auf der falschen Seite.
LLAP 🖖
Die Bytesequenzen sind nicht identisch:
LATIN CAPITAL LETTER O WITH DIAERESIS
C3 96
Ö
vs.
LATIN CAPITAL LETTER O
COMBINING DIAERESIS
4F CC 88
Ö
@@pl
Die Bytesequenzen sind nicht identisch:
Das hatten wir gestern schon geklärt. Und was gibt’s neues?
LLAP 🖖