Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Probleme mit der PHP-String-Kodierung

Detaillierte Erläuterung der Probleme mit der PHP-String-Kodierung

小云云
小云云Original
2018-03-22 15:42:391781Durchsuche

Wie wir alle wissen, belegen unterschiedliche Zeichenkodierungen unterschiedlich viele Bytes im Speicher. Beispielsweise belegen ASCII-codierte Zeichen 1 Byte, UTF-8-codierte chinesische Zeichen 3 Bytes und GBK 2 Bytes. PHP verfügt außerdem über mehrere Funktionen zum Abfangen von Zeichenfolgen, darunter substr und mb_substr, die häufig verwendet werden.

Wenn substr zum Abfangen chinesischer Zeichen verwendet wird, werden verstümmelte Zeichen angezeigt. Dies liegt daran, dass substr von Bytes abgefangen wird. Das heißt, UTF-8-codiertes Chinesisch, das Substr zum Abfangen verwendet, fängt nur 1/3 des Chinesischen ab, und natürlich werden verstümmelte Zeichen angezeigt.

mb_substr ( string $str , int $start [, int $length [, string $encoding ]] ) Der Parameter $encoding kann die Kodierung angeben. Wenn er weggelassen wird, wird die interne Zeichenkodierung verwendet.

Wenn Sie das Codierungsformat der Zeichenfolge nicht kennen, können Sie mit mb_detect_encoding Folgendes überprüfen:

$encoding = mb_detect_encoding($string, array("ASCII",'UTF-8 ′,"GB2312′ ,"GBK",'BIG5′));

Dann:

mb_substr ( string $str , int $start [, int $length [, string $encoding ] ] )

Wenn Sie mb_substr selbst implementieren, ist die Effizienz nicht sehr gut

Kodierungsbezogene PHP-Funktionen verwenden

ord(substr($str, $i, 1 )) > 0xa0)

ord($string) gibt den ASC-Code des ersten Zeichens der Zeichenfolge zurück. Dies kann verwendet werden, um festzustellen, ob das erste Zeichen der abgefangenen Zeichenfolge ein chinesisches Zeichen ist Beispielsweise ist ein von gb2312 codierter Text 2 Bytes, utf8 Es sind drei Bytes, das heißt, die Codierung größer als 256 ist chinesische Zeichen:

entspricht chinesischen Zeichen: preg_match_all('/[x80-xff]?. /', $string, $ match);

Match Englisch: preg_match_all("/[/x01-/x7f]+/", $string, $match); 🎜>

iconv ( string $in_charset , string $out_charset , string $str )

Wie GB2312 zu UTF-8: iconv("GB2312","UTF-8",$text)

URL-Codierung URL-Code

Alle nicht-alphanumerischen Zeichen außer -_ in der zurückgegebenen Zeichenfolge werden nach der Codierung durch ein Prozentzeichen (%) gefolgt von zwei hexadezimalen Ziffern ersetzt, und Leerzeichen werden als codiert Pluszeichen (+). Diese Kodierung ist die gleiche wie Die Kodierungsmethode für WWW-Formular-POST-Daten ist dieselbe und die Medientyp-Kodierungsmethode für application/x-www-form-urlencoded ist dieselbe.

Es ist jedoch zu beachten, dass bei der Kodierung nur ein Teil der URL kodiert werden sollte, da sonst auch Doppelpunkte und Backslashes in der URL maskiert werden.

Im Allgemeinen gibt es zwei Methoden der URL-Kodierung: eine ist die traditionelle Kodierung basierend auf GB2312 und die andere ist die Kodierung basierend auf UTF-8. Zum Beispiel:

Wir öffnen beispielsweise mit dem Browser Baidu und suchen nach „China“. In der Adressleiste sehen wir:

http://www.baidu .com/s?wd= %E4%B8%AD%E5%9B%BD&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=16&rsv_sug=0&rsv_sug4=302&rsv_sug1=11&inputT=22928

$url = '中国';
echo urlencode($url );
//UTF-8: %E4%B8%AD%E5%9B%BD
//GB2312:%D6%D0%B9%FA
That Das heißt, wir sehen, dass „China“ ist. Der Browser konvertiert es automatisch in: %E4%B8%AD%E5%9B%BD.

Der Unterschied zwischen Urlencode und Rawurlencode: Urlencode kodiert Leerzeichen als Pluszeichen „+“ und Rawurlencode kodiert Leerzeichen als Pluszeichen „%20“.

URL-Dekodierung urldecode und rawurldecode

1. Bei der Dekodierung können Sie das entsprechende verwenden urldecode() und rawurldecode(), dementsprechend dekodiert rawurldecode() das Pluszeichen („+“) nicht in ein Leerzeichen, während urldecode() dies tut.

2. Die von urldecode() und rawurldecode() dekodierte Zeichenfolge wird im UTF-8-Format kodiert.

Stellen Sie die PHP-Datei wie folgt zunächst auf die Kodierung gb2312 ein. Sie werden sehen, dass ein Teil davon verstümmelt und ein Teil normal ist.

Verwandte Empfehlungen:

Konvertierung der PHP-String-Kodierung
$url = '中国';
echo $a = urldecode(urlencode($url)) ,' ';
echo iconv('gb2312', 'utf-8', $a);

Analyse von PHP-String-Kodierungsproblemen

PHP Regular Judgment String Encoding_PHP Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Probleme mit der PHP-String-Kodierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn