MySQL - Combining characters ersetzen

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

scbawik

Senior HTML'ler
14 Juli 2011
2.552
448
83
Ich habe das Problem, dass ich beim Kopieren von Text aus Acrobat-PDFs, die Ü's als "U" + "Combining Diaeresis" erhalte:
https://de.wikipedia.org/wiki/Kombinierendes_Zeichen

Leider vergesse ich das immer wieder.

Wenn ich das ganze zuvor in einen Editor kopiere, wandelt dieser das zu einem richtigen "Ü" um.
Wenn ich das ganze jedoch im Browser absende und serverseitig in die DB schreibe bleibt es beim "U" + "Combining Diaeresis".

Folglich gibt es bei einer Textsuche nach "Brücke" keine Ergebnisse, da es eben keine richtigen Ü's sind.
Zusätzlich ist die Darstellung im FF und Chrome falsch (Punkte verschoben).

Ich wollte jetzt einfach ein Search & Replace über die entsprechenden Felder laufen lassen.
Nur leider scheitere ich daran dieses Combining Diaeresis überhaupt zu kopieren bzw. in eine SQL Abfrage zu schreiben, da es ja eigentlich kein normales Zeichen ist.

Jemand eine Idee wie ich das bewerkstelligen kann?
 

Aaron3219

Senior HTML'ler
6 Oktober 2015
1.147
237
63
19
Sind das ganz normale PDFs mit Umlauten, welche du in eine Tabelle schreiben willst?

Ist die Datenbank auf utf-8 gestellt:
PHP:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
Die Zeilen schreibst du DIREKT unter das Handle, welches die Datenbank öffnet.

Edit:
Das ist die alte Version, das hier ist die neue:
PHP:
mysqli_set_charset()
 

scbawik

Senior HTML'ler
14 Juli 2011
2.552
448
83
Sind das ganz normale PDFs mit Umlauten, welche du in eine Tabelle schreiben willst?

Ist die Datenbank auf utf-8 gestellt:
PHP:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
Die Zeilen schreibst du DIREKT unter das Handle, welches die Datenbank öffnet.

Edit:
Das ist die alte Version, das hier ist die neue:
PHP:
mysqli_set_charset()

Danke - aber soweit kenne ich mich schon aus ;)

Habe eine vorübergehende Lösung gefunden (Hoffe die ist nach dem Kopieren noch gleich):
SQL:
UPDATE text SET content = REPLACE(content, 'ü', 'ü') WHERE content LIKE '%ü%';
 

sysop

Mitglied
10 Juli 2015
154
22
18
www.mn-portal.at
Seltsame Lösung (vor allem, wenn sie funktioniert), weil REPLACE(content, 'ü', 'ü') muss zunächst ü erkennen um danach durch ü ersetzen zu können, Was lässt dann die Ausgabe scheitern?

Nicht, dass ich nun die Lösung schlechthin hätte, aber..

Was ist mit der Prüfung der Zeichen mittels ord() bzw chr() kommt da verwirrendes?
Wenn ja, was spricht gegen ein str_replace() der betreffenden Zeichen
 
Zuletzt bearbeitet:
  • Like
Reaktionen: scbawik

scbawik

Senior HTML'ler
14 Juli 2011
2.552
448
83
Seltsame Lösung (vor allem, wenn sie funktioniert), weil REPLACE(content, 'ü', 'ü') muss zunächst ü erkennen um danach durch ü ersetzen zu können, Was lässt dann die Ausgabe scheitern?

Nicht, dass ich nun die Lösung schlechthin hätte, aber..

Was ist mit der Prüfung der Zeichen mittels ord() bzw chr() kommt da verwirrendes?
Wenn ja, was spricht gegen ein str_replace() der betreffenden Zeichen

Danke für den Tipp - kommt aber eh genau das was ich vermutet habe:
http://sandbox.onlinephpfunctions.com/code/69418f656d7db64b8ae6df04dc22c6b317164681

Konnte endlich einen Testcase herstellen indem ich alles via Firefox gemacht habe.
PhpStorm, TextEdit, Safari usw. konvertieren die combined chars nämlich beim Einfügen und/oder Kopieren. Blicke ehrlich gesagt nicht mehr durch ob ich jetzt gerade ein ü habe oder ein u + combining diaeresis.

Auch wenn ich obiges Beispiel im Safari kopiere und direkt wieder einfüge, wird aus dem ersten "117" (u) ein "195" (ü). Firefox hingegen bleibt beim 117, auch nach Copy/Paste.

Die obige Abfrage hat funktioniert, da ich sie nicht über den Safari (phpMyAdmin) ausgeführt habe, sondern über Sequel Pro. Und da dort die u + combining diaeresis nicht konvertiert werden, war es mir so möglich via Copy/Paste eine Abfrage zu basteln die einerseits richtige Ü's beinhaltet, wie auch die kombinierten Ü's.

Irgendwo auf dem Weg von Sequel Pro nach html.de, sind diese jedoch wieder umgewandelt worden.
Das erste und dritte waren jedenfalls u + combining diaresis, während das zweite Ü ein richtiges war.

Also "übersetzt" so ungefähr...
SQL:
UPDATE text SET content = REPLACE(content, 'U+0075U+0308', 'U+00FC') WHERE content LIKE '%U+0075U+0308%';

Wenn ich jetzt noch eine PHP Funktion hätte, die genau das macht, wäre ich echt glücklich.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: sysop

scbawik

Senior HTML'ler
14 Juli 2011
2.552
448
83
So, habe noch ein wenig weiter nachgeforscht.

Einen optischen Unterschied sieht man vor allem bei Custom Fonts, insbesondere Minderwertige. Egal ob Webfonts oder Lokal installierte - die Doppelpunkte sind dann nicht über dem Buchstaben, sondern nach rechts verschoben, als wären sie ein eigenes Zeichen.

Ich konnte das Problem jetzt sogar nicht nur in meinem CMS reproduzieren, sondern sogar in Wordpress.
Ein Encoding Problem meinerseits kann ich daher ausschließen. Möglicherweise ist dieses Problem weiter verbreitet als angenommen und fällt nur kaum jemandem auf?
 
  • Like
Reaktionen: sysop