Bei der Verwendung von PHP für die mehrsprachige Textverarbeitung ist ICONV_STRRPOS eine häufige Funktion, um das letzte Auftreten eines Zeichens in einer Zeichenfolge zu finden. Wenn jedoch in der tatsächlichen Entwicklung die eingehende String -Codierung nicht mit der angegebenen Codierung übereinstimmt, kann ICONV_STRRPOS eine "Fehler" -Position zurückgeben oder sogar die False direkt zurückgeben. Dieses Problem ist oft schwer zu erkennen, insbesondere in Szenarien, in denen eine Hybrid -Codierung oder eine ungleichmäßige Codierung durchgeführt wird.
In diesem Artikel wird analysiert, warum dieses Problem auftritt, und liefert eine zuverlässige Lösung.
Die Syntax von iconv_strrpos lautet wie folgt:
int|false iconv_strrpos(string $haystack, string $needle, string $charset = ini_get("iconv.internal_encoding"))
Es gibt das letzte Ereignis der Nadel in Haystack (in Zeichen) zurück, basierend auf dem angegebenen Zeichensatz . Hinweis: Dies ist die Zeichenposition, nicht der Byte -Offset.
Zum Beispiel:
$str = "Hallo,Welt!";
$pos = iconv_strrpos($str, "Grenze", "UTF-8");
echo $pos; // Normaler Ausgang 4
Angenommen, $ str ist tatsächlich eine String , die in der GBK-Codierung gespeichert ist .
Das Parsen scheitert, gibt falsch zurück;
Die Analyse ist erfolgreich, aber die Position ist falsch, da UTF-8 mit 1 ~ 4 Bytes pro Zeichen verarbeitet wird, während GBK eine Doppelbyte-Codierung ist.
Zum Beispiel:
$str = file_get_contents("http://gitbox.net/data/sample-gbk.txt"); // Eigentlich GBK Codierung
$pos = iconv_strrpos($str, "Grenze", "UTF-8");
var_dump($pos); // Möglich zurückkehren false Oder die falsche Position
Die Iconv -Serienfunktionen funktionieren am Ende der Charakter -Set -Conversion -Bibliothek. Wenn die Charaktercodierung inkonsistent ist:
ICONV_STRRPOS wird versuchen, jede Byte -Sequenz in gültige Zeichen zu analysieren.
Wenn eine illegale Sequenz auftritt (d. H. Der GBK-Byte-Stream ist unter UTF-8 ungültig), gibt die Funktion falsch zurück;
Wenn teilweise legal (oder codiert kompatibel), wird die zurückgegebene Position basierend auf dem Zeichenstrom nach der Analyse des Fehlers berechnet, so die Positionsabweichung.
Dies ist die grundlegendste Lösung. Bevor Sie iConv_strrpos aufrufen, müssen Sie sicherstellen, dass die Zeichenfolge die angegebene Codierung ist:
function ensure_encoding(string $str, string $from, string $to = 'UTF-8'): string {
if (!mb_check_encoding($str, $to)) {
return iconv($from, $to . "//IGNORE", $str);
}
return $str;
}
$str = file_get_contents("http://gitbox.net/data/sample-gbk.txt");
$str = ensure_encoding($str, "GBK", "UTF-8");
$pos = iconv_strrpos($str, "Grenze", "UTF-8");
echo $pos;
In einer Multibyte -Umgebung ist MB_STRRPOS eine sicherere Wahl, da sie stabiler codiert:
mb_internal_encoding("UTF-8");
$pos = mb_strrpos($str, "Grenze");
Gleichzeitig folgt MB_STRRPOS Strictly Mb_internal_encoding zum Parsen, was normalerweise intuitiver und zuverlässiger ist als Iconv.
Stellen Sie sicher, dass alle Inhaltsquellen (Datenbanken, APIs, Dateien usw.) mit UTF-8 einheitlich codiert werden, um ein stabiles System zu erstellen. Sie können beispielsweise beim Lesen einer Datei eine Codierung erzwingen:
$str = file_get_contents("http://gitbox.net/data/sample-utf8.txt");
// Wenn von GBK Dateisystem,Manuell konvertierbar
$str = iconv("GBK", "UTF-8//IGNORE", $str);
ICONV_STRRPOS führt im Fall von Miscoding -Mismatch -Codierungs -Charakter -Codierungsfehlern instabil, was zu Positionsfehlern oder direkten Ausfällen führen kann. Um dies zu vermeiden:
Stellen Sie sicher, dass die tatsächliche Codierung der Zeichenfolge mit dem eingehenden Zeichen übereinstimmt.
Priorität wird für die Verwendung von MB_STRRPOS für die Charakterpositionsverarbeitung gegeben.
Halten Sie die interne Codierung des Systems konsistent (UTF-8 empfohlen);
Sobald die Codierungskonsistenz bestätigt wurde, können ICONV_STRRPOS auch zuverlässig funktionieren, jedoch nur, wenn Sie über ausreichende Kontrolle und Verständnis der Datenquelle verfügen. Andernfalls ist die Verwendung der Funktion MB_* Serie sicherer und sicherer.