strpos Suche nach Unicode in PHP (und Handhabung inline UTF-8)
-
30-09-2019 - |
Frage
ich habe ein Problem mit einer einfachen Suche zu tun für einen Zwei-Zeichen Unicode-String (die Nadel) in einer anderen Zeichenfolge (Heuhaufen), die nicht UTF-8
sein kann oder Ein Teil des Problems ist, weiß ich nicht, wie Sie den Code für die in strpos
Verwendung zu spezifizieren, und ich weiß nicht, ob PHP mit einer besonderen Unterstützung kompiliert werden muss für den Code, oder wenn ich mb_strpos
verwenden die ich zu vermeiden versuchen, da es auch nicht zur Verfügung.
dh. beispielsweise ist die Nadel U+56DE U+590D
(ohne den Raum)
Mit preg_match es preg_match("@\x{56DE}\x{590D}@",$haystack)
sein könnte
aber das eigentlich erfordert @u
, die nicht verfügbar sein könnten, und ich bekomme eine Compilation failed: character value in \x{...} sequence is too large
trotzdem.
Ich will nicht zu verwenden preg_match sowieso, da es deutlich langsamer sein könnte als strpos (es gibt auch andere Sequenzen, die durchsucht werden müssen).
Kann ich convert U+56DE U+590D
in einzelne Byte-Sequenz (möglicherweise 5-6 Zeichen) und dann für sie über strpos suchen? Ich kann nicht herausfinden, wie es zu Bytes konvertieren, wenn so.
Wie Sie Unicode-inline in PHP sowieso angeben? Ich meine außerhalb von PRCE?
$blah="\u56DE\u590D";
nicht funktioniert?
Vielen Dank für alle Ideen!
Lösung
Zuerst wird Ihre Frage schlecht strukturiert. Es hat mehrere Fragen an mehreren Punkten. Sie würden wahrscheinlich mehr Antworten bekommen, wenn Sie eine klare Struktur verwendet: 1) beschreiben die Aufgabe, die Sie erreichen wollen, 2) die Einschränkungen / Anforderungen, 3) die Strategie, die Sie in Betracht gezogen, 4), um die Schwierigkeiten, die Sie mit einer solchen Strategie gefunden / gibt es eine bessere.
sagte, dass, ich werde bis zum Ende starten:
$blah="\u56DE\u590D";
funktioniert nicht?
Nein. Die Sprache weiß nichts über Unicode. In PHP Strings sind Byte-Arrays. Deshalb, wie Sie ein Unicode-Codepunkte in einem PHP-Skript ausdrücken, hängt von der Codierung Sie verwenden möchten. Für UTF-8, wäre es "\xE5\x9B\x9E\xE5\xA4\x8D"
, für UTF-16 Big-Endian wäre "\x56\xDE\x59\x0D"
, und so weiter.
Kann ich convert
U+56DE U+590D
in einzelne Byte-Sequenz (möglicherweise 5-6 Zeichen) und dann für sie überstrpos
suchen? Ich kann nicht herausfinden, wie es zu Bytes konvertieren, wenn so.
, wobei der erste Teil, ja, das heißt, die Umwandlung in U+56DE U+590D
Bytes wird eine Klärung erforderlich. Sind diese UTF-16 Code-Einheiten oder Unicode-Codepunkte? Zum Beispiel: Wie ist 𪛖
vertreten? U+D869 U+uDED6
oder U+2A6D6
? Wenn sie Unicode-Codeeinheiten sind, ist es trivial sie in UTF-16 zu kodieren. Für UTF-16 Big-Endian, es ist nur "\x56\xDE\x59\x0D"
. Ansonsten ist es immer noch trivial sie UTF-32, zu kodieren, aber es dauert eine wenig mehr Arbeit das gleiche in UTF-16 (oder UTF-8) zu tun.
Für den zweiten Teil, lesen Sie weiter.
Ein Teil des Problems ist, weiß ich nicht, wie Sie den Code für die in
strpos
Verwendung zu spezifizieren, und ich weiß nicht, ob PHP mit einer besonderen Unterstützung kompiliert werden muss für den Code, oder wenn ichmb_strpos
verwenden die ich zu vermeiden versuchen, da es auch nicht zur Verfügung.
Was wollen Sie tun? Warum brauchen Sie eine Position in einer Zeichenfolge zu finden? strpos
werden Sie ein Byte für eine bestimmte Zeichenfolge Offset (auch hier in binärer Form interpretiert). Sind Sie versuchen, eine Zeichenfolge zu befestigen? strpos
(oder sogar mb_strpos
) mittleres Probleme in Unicode - eine Glyphe kann durch mehrere Codeeinheiten gebildet werden, so riskieren Sie Teil eines Glyphe Clipping. Ich kann Ihnen nicht raten, mehr, wenn Sie sagen, was Sie zu tun versuchen.
Andere Tipps
Sie schrieb ‚nicht verfügbar sein könnten.‘ Ich schlage vor, Sie versuchen mb_strpos .