Maison  >  Article  >  développement back-end  >  Explication détaillée des problèmes d'encodage de chaîne PHP

Explication détaillée des problèmes d'encodage de chaîne PHP

小云云
小云云original
2018-03-22 15:42:391821parcourir

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 urlencode

Tous 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%FA
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

Que 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 rawurldecode

1 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn