Bei der PHP-Programmierung stellen Sie häufig einige Herausforderungen beim Umgang mit Saitenlängen, insbesondere für Multi-Byte-Zeichensets (wie Chinesisch, Japanisch, Koreanisch usw.). Da Strlen () und Substr () -Funktionen standardmäßig für Single-Byte-Zeichen ausgelegt sind, haben sie möglicherweise Probleme in Multi-Byte-Zeichen. Glücklicherweise bietet PHP eine leistungsstarke Bibliothek von Iconv , in der iConv_substr () dieses Problem gut löst. Heute werden wir untersuchen, wie Sie iConv_substr () und strlen () verwenden, um die Länge der Saiten genau zu steuern.
In den traditionellen Funktionen von Substr () und Strlen () berechnen Strlen () , wenn wir uns mit Multi-Byte-Zeichen (wie Chinesisch) befassen, die Anzahl der Zeichen der Zeichen und nicht die Anzahl der Zeichen berechnet. Dies kann dazu führen, dass die berechnete Stringlänge nicht wie erwartet ist. Zum Beispiel:
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hallo,Welt!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>); </span><span><span class="hljs-comment">// Ausgabe 18</span></span><span>
</span></span>
Zu diesem Zeitpunkt gibt Strlen () die Anzahl der Bytes anstelle von Zeichen zurück. Chinesische Zeichen nehmen jeweils 3 Bytes auf, so dass diese Zeichenfolge 6 Zeichen hat, aber Strlen () gibt versehentlich 18 Bytes zurück.
iconv_substr () wird speziell zur Verarbeitung von Multibyte -Zeichen verwendet. Es kann die Anzahl der Zeichen und nicht die Bytes korrekt berechnen, sodass es die Länge der Zeichenfolge genau steuern kann.
Zunächst müssen wir iConv_strlen () verwenden, um die Anzahl der Zeichen der Zeichenfolge zu berechnen, nicht die Anzahl der Bytes. iconv_strlen () gibt die tatsächliche Anzahl der Zeichen in der Zeichenfolge zurück, unabhängig davon, ob der Zeichensatz ein einzelner Byte oder ein Multi-Byte ist.
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hallo,Welt!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">iconv_strlen</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>); </span><span><span class="hljs-comment">// Ausgabe 6</span></span><span>
</span></span>
Als nächstes können wir iConv_substr () verwenden, um die Zeichenfolge abzufangen. Die Parameter ähneln Substr () , unterstützen jedoch das richtige Abfangen von Multibyte -Zeichensätzen. Durch Kombinieren von iConv_strlen () und iconv_substr () können wir die Zeichenlänge der abgefangenen Zeichenfolge genau steuern.
<span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hallo,Welt!"</span></span><span>;
</span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-number">3</span></span><span>;
</span><span><span class="hljs-variable">$substring</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_substr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$substring</span></span><span>; </span><span><span class="hljs-comment">// Ausgabe "Hallo,"</span></span><span>
</span></span>
In diesem Beispiel stellt iConv_substr () aus dem ersten Zeichen der Zeichenfolge ab und fängt 3 Zeichen ab. Hier ist die Länge eher eine Zeichenzahl als eine Byte -Zahl, die das Problem der ungenauen Bytezahlen in substr () vermeidet.
Manchmal müssen wir die Länge der Zeichenfolge dynamisch gemäß verschiedenen Bedingungen steuern, z. B. die Anzahl der angezeigten Wörter einschränken. Wir können dies durch die Kombination von iconv_substr () und iconv_strlen () leicht erreichen.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">truncate_string</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$string</span></span></span><span>, </span><span><span class="hljs-variable">$max_length</span></span><span>) {
</span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-title function_ invoke__">iconv_strlen</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$length</span></span><span> > </span><span><span class="hljs-variable">$max_length</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">iconv_substr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$max_length</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>) . </span><span><span class="hljs-string">'...'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$string</span></span><span>;
}
}
</span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hallo,Welt!Dies ist eine Testzeichenfolge。"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">truncate_string</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// Ausgabe "Hallo,Welt!..."</span></span><span>
</span></span>
In diesem Beispiel fängt die Funktion truncate_string () die Zeichenfolge basierend auf der angegebenen maximalen Länge ab und fügt am Ende eine Ellipse hinzu.
Durch die Verwendung von iConv_substr () und iconv_strlen () können wir das Problem der String -Länge in einem Multibyte -Zeichen effektiv lösen. Diese Funktionen ermöglichen es uns, Strings eher durch Zeichen als durch Bytes zu bedienen, wodurch die Ungenauigkeit von Strlen () und Substr () bei Multibyte -Zeichen vermieden wird. Wenn Ihr Projekt sich mit mehrsprachigen Sprachen befassen muss, insbesondere wenn Sie chinesische, japanische, koreanische und andere Charakter -Sets einbeziehen, sind diese beiden Funktionen sehr praktische Werkzeuge.