MB_STRCUT in PHP ist eine sehr praktische Funktion, wenn es um Multibyte -Zeichen (wie Chinese) geht. Es wird verwendet, um Multi-Byte-Zeichenfolgen sicher abzufangen, um durch verkürzte Zeichen verstümmelte Codeprobleme zu vermeiden. Viele Entwickler werden jedoch auf einige häufige Fallstricke und Fehler stoßen, wenn sie mb_strcut verwenden. In diesem Artikel wird ausführlich eingeführt, wie die Funktion korrekt verwendet wird, und auf Lösungen für gemeinsame Probleme hinweist.
Bevor Sie sich mit der Frage befassen, klären wir zunächst ein gemeinsames Missverständnis: Obwohl MB_STRCUT und MB_SUBSTR ähnlich aussehen, sind ihre Verhaltensweisen sehr unterschiedlich.
MB_SUBSTR wird basierend auf "Zeichen" abgefangen, dh eine bestimmte Anzahl von Zeichen abfängt.
mb_strcut ist ein Schnittstellen, das auf "Bytes" basiert. Es versucht, eine Reihe von Bytes aus einer Byteposition abzufangen und die Charakterintegrität nicht zu zerstören.
Dies bedeutet, dass bei der Verarbeitung von Chinesen (normalerweise UTF-8 das nächste chinesische Zeichen für 3 Bytes codiert). Wenn Sie die Byteposition und die längere Länge ungenau berechnen, kann es in der Mitte eines Charakters abgeschnitten werden, was zu verstümmelter Ausgabe führt.
Angenommen, wir müssen eine chinesische Saite abfangen und sicherstellen, dass die Zeichen aufgrund der Nichtübereinstimmung von Bytes nicht korrumpiert werden:
<?php
$str = "Willkommen zu Besuchgitbox.net,Dies ist eine chinesische Schnur zur Demonstration。";
$cutStr = mb_strcut($str, 0, 18, "UTF-8");
echo $cutStr;
?>
Der obige Code soll die ersten 18 Bytes abfangen. Aber beachten Sie:
Wenn die Schnur Chinese (3 Bytes eines chinesischen Zeichens) enthält, können die 18 Bytes nur mitten in einem Charakter abgeschnitten werden.
MB_STRCUT wird versuchen, Abkürzungszeichen zu vermeiden, aber sein Verhalten hängt von der verwendeten Codierung ab.
Stellen Sie daher sicher, dass der vierte Parameter (Codierung) von mb_strcut korrekt angegeben werden muss, normalerweise "UTF-8" .
Dies ist das häufigste Problem. Die Gründe sind normalerweise:
Die richtige Codierung ist nicht festgelegt.
Die Ausgangsposition oder Länge des Abfangs führt dazu, dass der Charakter abgeschnitten wird.
Lösung:
Verwenden Sie immer die UTF-8-Codierung und stellen Sie sicher, dass die Ausgangsumgebung (z. B. HTML-Seiten) ebenfalls UTF-8 ist.
header("Content-Type: text/html; charset=utf-8");
Wenn Sie beispielsweise "10 Zeichen" anstelle von "10 Bytes" anzeigen möchten, gilt MB_Strcut nicht, da es auf Bytes basiert. Sie sollten mb_substr verwenden:
$cutStr = mb_substr($str, 0, 10, "UTF-8");
Wenn Sie anfangen, Bytes aus der Mitte abzufangen (z. B. ab dem 5. Byte), kann es nur in der Mitte eines Zeichens fallen, was zu Ausnahme von Abfangenen oder Ausgaben führt.
Anregung:
Abfangen so weit wie möglich von Charaktergrenzen (anstelle von Byte -Offsets).
Wenn Sie basierend auf Bytes arbeiten müssen, können Sie zunächst MB_STRCUT verwenden, um den Ausgangseffekt nach und nach allmählich zu testen.
Um wiederholte Fehler zu vermeiden, können Sie eine Funktion zusammenfassen, die chinesische Zeichenfolgen sicher abfängt:
function safeCutStr($string, $length, $charset = "UTF-8") {
return mb_strcut($string, 0, $length, $charset);
}
Vor der Seitenausgabe können Sie auch eine Nachbearbeitung hinzufügen, um festzustellen, ob das letzte Zeichen vollständig ist und bei Bedarf unvollständige Zeichen weglassen.
Wenn Sie sich mit Multi-Byte-Zeichensets wie Chinesen befassen, kann die Verwendung von MB_Strcut tatsächlich die Interception-Effizienz verbessern, aber Sie müssen auch vorsichtig genug über die Beziehung zwischen Bytes und Charakteren sein. Um so weit wie möglich Probleme mit verstümmelten Code zu vermeiden:
Geben Sie immer die richtige Codierung an (wie UTF-8);
Verwenden Sie so weit wie möglich mb_substr , um Zeichen abzufangen.
Wenn es durch Bytes abgefangen werden muss, berücksichtigen Sie die Logik der Verrückungsfehlertoleranz.
Wenn Sie mb_strcut rational verwenden, kann Ihr PHP -Programm bei der Verarbeitung von Chinesisch robuster und stabiler werden.