MB_STRCUT ist eine sehr praktische Funktion, wenn sie PHP verwenden, um Multibyte -Zeichenfolgen zu verarbeiten. Es kann die angegebene Bytelänge einer Zeichenfolge ohne verstümmelte Codeprobleme abfangen, die durch Abschneiden von Multibyte -Zeichen wie herkömmlichem Substr verursacht werden. Wenn wir jedoch Zeichenfolgen in der Datenbank betreiben, insbesondere wenn es um mehrsprachige Inhalte und Codierungskonvertierung geht, ist die Verwendung von MB_STRCUT auch anfällig für einige Fehler. Dieser Artikel wird diese häufigen Fehler und ihre Vermeidung im Detail analysieren.
Mb_Strcut soll die angegebene Anzahl von Bytes aus der Zeichenfolge abschneiden, nicht die Anzahl der Zeichen. Es ist für Multi-Byte-Codierung ausgelegt, wodurch verstümmelte Code vermieden wird, das durch Abschneiden eines Multi-Byte-Zeichens verursacht wird.
Der Funktionsprototyp lautet wie folgt:
mb_strcut(string $string, int $start, int $length = null, string $encoding = null): string
$ Zeichenfolge : Geben Sie eine Zeichenfolge ein.
$ start : Die Start -Byte -Position.
$ Länge : Die abgefangene Bytelänge (optional).
$ codierung : Zeichencodierung, Standard ist eine interne Codierung.
Die in der Datenbank gespeicherte String -Codierung steht im Widerspruch zu der von Mb_Strcut verwendeten Codierung, die abnormale Interceptionsergebnisse verursacht. Das Datenbankfeld ist beispielsweise die UTF-8-Codierung, aber das Programm verwendet die Standard-interne Codierung (wahrscheinlich ISO-8859-1), wodurch Fehlerpositionsfehler von Byte verursacht werden.
Fehlermanifestationen:
Das Intercept -Ergebnis ist verstümmelt, die Charaktere sind unvollständig und sogar das Programm legt eine Ausnahme aus.
Wie man es vermeidet:
Identifizieren Sie beispielsweise $ coding :
mb_strcut($string, 0, 10, 'UTF-8');
Stellen Sie sicher, dass die Codierung von Datenbankverbindungen und Abfragenergebnissen mit der Codierung des Programms übereinstimmt. MySQL kann ausgeführt werden von:
SET NAMES 'utf8mb4';
Oder geben Sie an, wann die PDO -Verbindung:
new PDO('mysql:host=...;dbname=...', $user, $pass, [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
]);
Der $ startparameter von MB_STRCUT ist die Byte -Position, nicht die Zeichenposition. Wenn Entwickler es gewohnt sind, Charakterpositionen als Byte -Positionen zu übergeben, führt dies zu einer Abfangpositionsabweichung.
Fehlermanifestationen:
Die abgefangene Zeichenfolge beginnt mit den Erwartungen, was zu fehlenden Zeichen oder verstümmelten Code führen kann.
Wie man es vermeidet:
Wenn Sie MB_STRPOS verwenden, um die Byte -Position zu erhalten, geben Sie dieselbe Codierung an.
Wenn Sie Charakterpositionen verwenden möchten, müssen Sie zuerst die Charakterposition in Byte -Position konvertieren.
Beispiel:
$pos_char = 3; // 1.3Charaktere
$pos_byte = strlen(mb_substr($string, 0, $pos_char, 'UTF-8'));
$result = mb_strcut($string, $pos_byte, 10, 'UTF-8');
$ Länge ist die Bytelänge. Wenn sich die abgefangene Länge in der Mitte der Multi-Byte-Zeichen befindet, wird Mb_Strcut sicher an die vollständige Zeichengrenze abgeschnitten. Wenn jedoch der logische Fehler die Länge nicht ordnungsgemäß eingestellt wird, kann dies den Abfangeneffekt beeinflussen.
Wie man es vermeidet:
Berechnen Sie die Bytelänge angemessen gemäß den Anforderungen.
Wenn Sie eine feste Anzahl von Zeichen abfangen möchten, können Sie sie in Kombination mit MB_SUBSTR verwenden.
Unter der Annahme, dass eine chinesische Zeichenfolge in der Datenbank gespeichert ist, möchten wir die ersten 10 Bytes abfangen.
<?php
// Holen Sie sich Strings aus der Datenbank
$string = "Hallo,Willkommenmb_strcutFunktion!";
// Geben Sie die Codierung an
$encoding = 'UTF-8';
// Vor Abfangen10Bytes
$result = mb_strcut($string, 0, 10, $encoding);
echo $result;
?>
In diesem Beispiel stellt MB_Strcut sicher, dass die Hälfte des chinesischen Zeichens nicht abgeschnitten wird und dass die Ausgangszeichenfolge nicht verstümmelt wird.
Wenn Sie MB_STRCUT verwenden, können Sie es klar codieren und mit der Datenbankcodierung übereinstimmen.
Beachten Sie, dass $ Start und $ Länge beide Byte -Einheiten sind, keine Charaktereinheiten, daher müssen sie sorgfältig berechnet werden.
Koordinieren Sie mit den Einstellungen für Datenbankzeichen festgelegt, um Fehler zu vermeiden, die durch die Codierung von Nichtübereinstimmungen verursacht werden.
Für den Zeichenabschnitt wird empfohlen, MB_SUBSTR zu verwenden. MB_STRCUT eignet sich besser für Szenarien, in denen Byte -Intercept abgefangen wird.
Das Beherrschen der oben genannten Fähigkeiten kann effektiv häufige Fehler bei der Verarbeitung von Datenbankzeichenfolge durch MB_STRCUT vermeiden und sicherstellen, dass das Programm korrekte und sichere Multi-Byte-Zeichenfolgen ausgibt.
<?php
// Beispiel:Sichern Sie Multibyte -Zeichenfolgen in der Datenbank
// Angenommen, die Datenbank ist verbunden,Und das Charakter -Set istutf8mb4
// Lesen Sie Strings aus der Datenbank
$query = "SELECT content FROM articles WHERE id = 1";
$result = $pdo->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);
$content = $row['content'];
$encoding = 'UTF-8';
// Vor Abfangen50Bytes,Vermeiden Sie verstümmelten Code
$snippet = mb_strcut($content, 0, 50, $encoding);
echo $snippet;
?>
Wenn Sie mehr über die Verarbeitung von Multibyte -String erfahren möchten, können Sie besuchen:
https://gitbox.net/php/manual/zh/function.mb-Strcut.php