Aktueller Standort: Startseite> Neueste Artikel> Wie hält ich die ursprüngliche Kodierung unverändert nach der Verwendung von mb_scrub?

Wie hält ich die ursprüngliche Kodierung unverändert nach der Verwendung von mb_scrub?

gitbox 2025-08-13

Im Umgang mit Multibyte -Saiten ist MB_Scrub eine sehr praktische Funktion, die uns helfen kann, Zeichenfolgen zu beseitigen, die illegale Zeichen enthalten, und verhindern, dass das Programm aufgrund von Codierungsproblemen während der nachfolgenden Verarbeitung stürzt. Viele Entwickler werden jedoch nach Verwendung von mb_scrub auf ein Problem stoßen :. Dies kann zu einer Codierungsverwirrung im System führen, insbesondere wenn Ihre Anwendung von bestimmten Codierungen abhängt (wie Shift_JIS, ISO-8859-1 usw.).

Wie kann ich also die ursprüngliche Codierung nach der Verwendung von Mb_Scrub , um die Zeichenfolge zu reinigen, unverändert halten?

Problemanalyse

Schauen wir uns zunächst die grundlegende Verwendung von mb_scrub an:

 <span><span><span class="hljs-variable">$clean</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>);
</span></span>

Wenn keine Codierung angegeben ist, verwendet PHP standardmäßig eine interne Zeichencodierung (normalerweise UTF-8). MB_SCUB wird versuchen, die Zeichenfolge in die angegebene Codierung umzuwandeln. Wenn die Konvertierung fehlschlägt, ersetzen Sie die illegalen Zeichen durch U+FFFD (?). Die Codierung des Rückgabewerts ist jedoch häufig die Codierung, die beim Übergeben angegeben wird, und nicht die Codierung der ursprünglichen Zeichenfolge.

Wenn Ihre Zeichenfolge ursprünglich Shift_jis codiert wurde und Sie sie mit dem Standard- MB_Scrub ($ str) reinigen, haben Sie eine UTF-8-codierte Zeichenfolge, die zu verstümmelter Code oder Systemkompatibilität führen kann.

Lösung: Geben Sie explizit die ursprüngliche Codierung an

Um dieses Problem zu lösen, müssen Sie zuerst die Codierung der ursprünglichen Zeichenfolge erkennen und dann explizit die Codierung übergeben, wenn mb_scrub aufgerufen wird. Zum Beispiel:

 <span><span><span class="hljs-variable">$original_encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>, </span><span><span class="hljs-title function_ invoke__">mb_list_encodings</span></span><span>(), </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$clean_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>, </span><span><span class="hljs-variable">$original_encoding</span></span><span>);
</span></span>

Auf diese Weise weiß Mb_Scrub , welche Codierungsmethode die Zeichenfolge versteht, und der Rückgabewert verwendet auch dieselbe Codierung.

Hinweis: Die Genauigkeit von MB_DETECT_ENCODING hängt vom String -Inhalt und der codierten Liste ab. Einige vage Codierungen werden möglicherweise nicht korrekt identifiziert. Es wird empfohlen, den Umfang so klar wie möglich basierend auf dem Kontext zu definieren.

Strengere Beispiele

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">clean_preserve_encoding</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$input</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, [</span><span><span class="hljs-string">'SJIS'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'ISO-8859-1'</span></span><span>, </span><span><span class="hljs-string">'EUC-JP'</span></span><span>], </span><span><span class="hljs-literal">true</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$encoding</span></span><span>) {
        </span><span><span class="hljs-comment">// Codierung kann nicht erfasst werden,Standardmäßig verwendet UTF-8,Oder machen Sie eine Ausnahme</span></span><span>
        </span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;
    }
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
}
</span></span>

Diese Funktion wird ihr Bestes geben, um die Codierung der Eingangszeichenfolge zu erhalten, und schädt die Konsistenz der Codierung auch dann, wenn illegale Zeichen im Inhalt erscheinen.

Zusätzliche Vorschläge

  1. Immer Original -Codierung aufzeichnen : Wenn Ihr System mehrere Codierungen unterstützen muss, ist es eine gute Angewohnheit, die Codierung jedes Textstücks im Datenstrom aufzuzeichnen.

  2. Die Priorität wird UTF-8 vor Priorität gegeben : Wenn Sie die Eingabe- und Ausgangsumgebung steuern können, wird empfohlen, die UTF-8-Codierung so einheitlich wie möglich zu verwenden, um Komplexität zu vermeiden, die durch das Mischen mehrerer Codierungen verursacht werden.

  3. Testen Sie extreme Situationen : Insbesondere bei der Verarbeitung externer Daten sollten Sie auf gemischte illegale Bytes, falsche Boms, inkonsistente Codierung usw. testen.

Zusammenfassen

Das Reinigen illegaler Zeichenfolgen mit MB_Scrub ist ein wichtiges Mittel zur sicheren Handhabung von Multibyte -Zeichenfolgen, kann jedoch das Codierungsformat der Zeichenfolge ändern, wenn sie nicht explizit angegeben ist. Um dieses Problem zu vermeiden, sollte die ursprüngliche Codierung beim Aufrufen von Mb_Scrub explizit angegeben werden, um sicherzustellen, dass die gereinigte Zeichenfolge die ursprüngliche Codierung weiterhin behält.

Dies behält nicht nur die Datenkonsistenz bei, sondern verringert auch die Nebenwirkungen der Codierungsumwandlung. Es ist eine unverzichtbare praktische Fähigkeit bei der Entwicklung von mehrsprachigen und mehrkodierenden kompatiblen Anwendungen.