Axel Richter: suchen in UTF-8

Beitrag lesen

Hallo,

Also es steht nicht, wie Du weiter unten beschreibst Hex-Codiert, sondern utf-8-codiert byte für byte quasi als latin-1 geschrieben, also aus ä wird ä und aus Ä wird Ä.

Was meinst Du mit _nicht_ Hex-Codiert? Im Speicher, egal wo, stehen Bits, diese bilden Oktets z.B. "01001000", das ist 0x48 und das ist in US-ASCII ein "H".

Das "ä" in UTF-8 ist 0xc3a4. Das wird in ISO-8859-1 als "ä" dargestellt. Das, was Du beschreibst, ist also das, was ich beschrieb ;-)).

Wenn im Feldinhalt "Höhe" als "48c3b66865" steht, Du aber nur WHERE feld = "Höhe" eingeben kannst, und Höhe eben in ISO-8859-1 "48f66865" ist, dann kann dort nichts übereinstimmen.
natürlich nicht so. Wenn das Suchformular ä als utf-8 abschickt, dann wird die DB schon nach ö gefragt.

Aha, also so wie bei feld = "H".concat(0xc3b6).concat("he") für "Höhe", nur anders geschrieben, eben "Höhe".

Das geht ja auch, aber Ä wäre eben eine ganz andere Bytefolge und da bräuchte man ja endlos Tabellen, welch utf-8 Zeichen als Gross-/klein zusammengehören.

Ja, das bräuchte man wohl.

Du hast keine Chance, nutze sie ;-)). Man könnte, wenn die Datenbank das anbietet, mit WHERE feld = "H".concat(0xc3b6).concat("he") suchen. Oder man könnte mit Hilfe des ersten Teils der Funktion von Christian, wo es um Zwei-Octet-UTF-8, beginnend mit c<0xe0 geht,  die UTF-8-Octetstreams micht in Entities, sondern in 1-Byte-Hex-Werte umwandeln.
na, da kann ich auch bei ISO bleiben :-)

Richtig, besser wäre auf eine Speicherung in einer Umgebung mit UTF-8-Unterstützung zu setzen, egal ob Datenbank oder nicht. UTF-8 im HTML-Formular lohnt sich nur, wenn die gesamte verarbeitende und speichernde Software auch damit umgehen kann.

zusammengehörende Gross-/kleinVersionen von den Buchstaben

Gibt es die für die Computerspeicherung denn in US-ASCII bzw. ISO-8859-1? Die Möglichkeit der case insensitiven Suche basiert auf der Festlegung, dass die kleinen Buchstaben jeweils "Grossbuchstabe"+0x20 codiert sind.
A = 0x41 = 01000001, a = 0x61 01100001, ...
P = 0x50 = 01010000, p = 0x70 01110000, ...
Ä = 0xC4 = 11000100, ä = 0xE4 11100100, ...
             ^                  ^ Dieses Bit ist das "case-Gen ;-)", das muss beim Vergleich nur ausgeblendet werden.

Ob das bei UTF-8 noch genau so einfach geht? Bei dem UTF-8, welches für die Zeichen aus ISO-8859-1 zuständig ist, sollte es das eigentlich.

viele Grüße

Axel