Maison > Article > développement back-end > Explication détaillée des problèmes d'encodage de chaîne PHP
Comme nous le savons tous, différents codages de caractères occupent différents nombres d'octets en mémoire. Par exemple, les caractères codés ASCII occupent 1 octet, les caractères chinois codés UTF-8 occupent 3 octets et GBK 2 octets. PHP est également livré avec plusieurs fonctions d'interception de chaînes, parmi lesquelles substr et mb_substr sont couramment utilisées.
Lorsque vous utilisez substr pour intercepter des caractères chinois, des caractères tronqués apparaîtront car substr est intercepté par des octets. Autrement dit, le chinois codé en UTF-8, utilisant substr pour intercepter, n'interceptera qu'un tiers du chinois et, bien sûr, des caractères tronqués apparaîtront.
mb_substr ( string $str , int $start [, int $length [, string $encoding ]] ) Le paramètre $encoding peut spécifier l'encodage. S'il est omis, l'encodage de caractères interne est utilisé.
Si vous ne connaissez pas le format d'encodage de la chaîne, vous pouvez utiliser mb_detect_encoding pour vérifier :
$encoding = mb_detect_encoding($string, array("ASCII",'UTF-8 ′,"GB2312′ ,"GBK",'BIG5′));
Puis :
mb_substr ( string $str , int $start [, int $length [, string $encoding ] ] )
Si vous implémentez vous-même mb_substr, l'efficacité n'est pas très bonne
Les fonctions php liées à l'encodage utilisent
ord(substr($str, $i, 1) ) > 0xa0)
ord($string) renvoie le code ASC du premier caractère de la chaîne. Cela peut être utilisé pour déterminer si le premier caractère de la chaîne interceptée est un caractère chinois, car par exemple. , un texte codé par gb2312 fait 2 octets, utf8 C'est trois octets. Autrement dit, le codage supérieur à 256 est constitué de caractères chinois :
correspond aux caractères chinois : preg_match_all('/[x80-xff]?./ ', $string, $ match);
Correspondance en anglais : preg_match_all("/[/x01-/x7f]+/",
Conversion d'encodage
iconv ( string $in_charset , string $out_charset , string $str ) Tel que GB2312 vers UTF-8 : iconv("GB2312","UTF-8",$text)url encoding urlencodeTous les caractères non alphanumériques sauf -_ dans la chaîne renvoyée après l'encodage seront remplacés par un signe de pourcentage (%) suivi de deux chiffres hexadécimaux, et les espaces seront codés comme plus. signes (+). Ce codage est le même que La méthode de codage des données POST du formulaire WWW est la même, et la méthode de codage du type de média application/x-www-form-urlencoded est la même. Cependant, il convient de noter que seule une partie de l'URL doit être encodée lors de l'encodage, sinon les deux-points et les barres obliques inverses dans l'URL seront également échappés. Il existe généralement deux méthodes d'URLEncoding, l'une est l'encodage traditionnel basé sur GB2312 et l'autre est l'encodage basé sur UTF-8. Par exemple :
Par exemple, nous utilisons le navigateur pour ouvrir Baidu et recherchons « Chine ». Dans la barre d'adresse, nous voyons :
$url = '中国'; echo urlencode($url ); //UTF-8: %E4%B8%AD%E5%9B%BD //GB2312:%D6%D0%B9%FAhttp://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=22928Que c'est-à-dire que nous voyons que "Chine" est Le navigateur le convertit automatiquement en : %E4%B8%AD%E5%9B%BD. La différence entre urlencode et rawurlencode : urlencode encode les espaces sous la forme d'un signe plus "+", et rawurlencode encode les espaces sous la forme d'un signe plus "%20". url décodage urldecode et rawurldecode1 Lors du décodage, vous pouvez utiliser le correspondant. urldecode() et rawurldecode(), par conséquent, rawurldecode() ne décode pas le signe plus («+») dans un espace, contrairement à urldecode(). 2. La chaîne décodée par urldecode() et rawurldecode() est codée au format UTF-8. Si l'URL contient du chinois non codé en UTF-8, la chaîne décodée doit être convertie. Comme suit, définissez d'abord le fichier php sur l'encodage gb2312. Vous verrez qu’une partie est tronquée et qu’une partie est normale.
Recommandations associées :
$url = '中国'; echo $a = urldecode(urlencode($url)) ,' '; echo iconv('gb2312', 'utf-8', $a);
Conversion d'encodage de chaîne PHP
Analyse des problèmes d'encodage de chaîne PHP
Tutoriel PHP Regular Judgment String Encoding_PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!