J'ai lu beaucoup d'articles sur le codage récemment, je l'ai donc divisé en deux articles de blog pour parler des connaissances liées à "PHP, chaînes, encodage, UTF-8". Cet article de blog est la première moitié, divisée en quatre parties principales, à savoir " "Définition et utilisation des chaînes", "Conversion de chaînes", "La nature des chaînes PHP", "Chaînes multi-octets". La première moitié est relativement basique, et l'article suivant "Meilleures pratiques de PHP et UTF-8" contiendra peut-être plus d'informations.
Les chaînes peuvent être définies de quatre manières en PHP :
Chaîne entre guillemets simples
Les chaînes entre guillemets simples sont similaires aux chaînes brutes en Python, ce qui signifie que les chaînes entre guillemets simples n'ont pas de fonctions d'analyse de variables ni de fonctions d'échappement de caractères spéciaux. Par exemple, $str='hellonworld', n n'a pas de fonction de nouvelle ligne.
Chaîne entre guillemets
Les chaînes entre guillemets doubles ont des fonctions d'analyse de variables et des fonctions d'échappement de caractères spéciaux que les chaînes entre guillemets simples n'ont pas.
Personnellement, je suis très intéressé par l'évasion spéciale des chaînes hexadécimales et octales. Ajout spécial :
\[0-7]{1,3} #八进制表达方式 \x[0-9A-Fa-f]{1,2} #十六进制表达方式
. hérdoc
Cette expression est similaire à une longue chaîne en Python et peut définir une chaîne contenant plusieurs lignes. Sa définition grammaticale est très stricte, vous devez donc y prêter attention lorsque vous l'utilisez.
$str=<<<EOD hello\n world EOD;
Nowdoc
Nowdoc est similaire à une chaîne entre guillemets simples et n'analyse pas les variables. Il est plus adapté pour définir une grande section de texte sans échapper aux caractères spéciaux.
Analyse des variables
La partie la plus puissante des chaînes PHP est l'analyse des variables, qui peut analyser les variables en fonction du contexte au moment de l'exécution (il s'agit d'un langage interprété), ce qui peut produire de nombreuses utilisations merveilleuses.
L'analyse simple des variables signifie que la chaîne peut contenir des « variables », des « tableaux » et des « propriétés d'objet ». Les règles de syntaxe complexes doivent utiliser des symboles {} pour fonctionner (pour former une expression).
Voyons la puissance de l'analyse des variables à travers un exemple
class beers { const softdrink = 'softdrink'; public static $ale = 'ale'; public $data = array(1,3,"k"=>4); } $softdrink = "softdrink"; $ale = "ale"; $arr = array("arr1","arr2","arr3"=>"arr4","arr4"=>array(1,2)); $arr4 = "arr4"; $obj = new beers; echo "line1:{$arr[1]}\n"; echo "line2:{$arr['arr4'][0]}\n"; echo "line3:{$obj->data[1]}\n"; echo "line4:{${$arr['arr3']}}\n"; echo "line5:{${$arr['arr3']}[1]}\n"; echo "line6:{${beers::softdrink}}\n"; echo "line7:{${beers::$ale}}\n";
Une autre raison pour laquelle le langage PHP est plus simple que Python est la conversion implicite des types, qui simplifiera de nombreuses opérations. Cela s'explique par la conversion de chaînes.
Coercition de type chaîne
$var = 10 ; $dvar = (string)$var ; echo $dvar . "_" . gettype($dvar);
La fonction strval() consiste à obtenir la valeur de chaîne de la variable :
$var = 10.2 ; $dvar = strval($var) ; echo gettype($var) . "_" . $dvar . "_" . gettype($dvar);
La fonction settype() définit le type de la variable :
$str = "10hello"; settype($str, "integer"); echo $str ;
Pendant le processus de conversion de type forcé, certaines règles seront suivies lors de la conversion d'autres types de valeurs en chaînes. Par exemple, une valeur booléenne TRUE est convertie en une chaîne de "1". Il est préférable de comprendre les règles pertinentes.
Conversion de type automatique
Les deux conversions ci-dessus sont des conversions d'affichage, et il est plus important de prêter attention à la conversion de type automatique. Dans une expression qui nécessite une chaîne, elle sera automatiquement convertie en type. Pour plus de détails, voir l'exemple :
.$bool = true; $str = 10 + "hello" echo $bool . "_" . $str ;
Citant l'explication de la documentation PHP :
La chaîne en PHP est implémentée sous la forme d'un tableau d'octets plus un entier spécifiant la longueur du tampon. Il n'y a aucune information sur la façon de convertir les octets en caractères, c'est au programmeur de décider. Il n'y a aucune restriction quant aux valeurs qui composent une chaîne, y compris les octets avec une valeur de 0 qui peuvent apparaître n'importe où dans la chaîne.
PHP ne spécifie pas le codage de la chaîne. La manière dont la chaîne est codée dépend du programmeur. Les chaînes sont codées selon le codage du fichier PHP. Par exemple, si l'encodage de votre fichier est GBK, alors le contenu de votre code sera GBK.
Pour compléter le concept de sécurité binaire, un octet avec une valeur de 0 (NULL) peut être à n'importe quelle position dans la chaîne, et certaines fonctions non binaires de PHP sont appelées fonctions C en bas, qui ignoreront les caractères après NULL. .
Tant que l'encodage des fichiers PHP est compatible avec ASCII, les opérations sur les chaînes peuvent être bien gérées. Cependant, les opérations sur les chaînes sont toujours de nature native (quel que soit l'encodage du fichier), vous devez donc faire attention lorsque vous les utilisez :
Certaines fonctions supposent que les chaînes sont codées en octets uniques, mais n'exigent pas que les octets soient interprétés comme des caractères spécifiques. Par exemple, la fonction sbustr().
De nombreuses fonctions doivent transmettre explicitement des paramètres d'encodage, sinon les valeurs par défaut seront obtenues à partir du fichier PHP.INI, comme la fonction htmlentities().
Il existe également certaines fonctions liées à la zone locale, et ces fonctions ne peuvent fonctionner que sur un seul octet.
Dans des circonstances normales, bien que PHP ne prenne pas en charge les caractères Unicode en interne, il prend en charge l'encodage UTF-8. Dans la plupart des cas, il n'y aura aucun problème. Cependant, les situations suivantes peuvent ne pas être gérées :
Comment convertir des chaînes codées non UTF-8
Une page Web encodée en UTF-8, mais lorsque les utilisateurs soumettent le formulaire, ils peuvent utiliser l'encodage GBK (qui n'est pas conforme aux balises méta)
Un fichier PHP encodé en UTF-8, utilisant strlen("China") renvoie 6 au lieu du nombre réel de caractères (2)
Alors comment résoudre ce problème ? PHP fournit l'extension mbstring !
L'extension mbstring n'est pas activée par défaut. Vous avez besoin de --enable-mbstring lors de l'installation.
Regardons d'abord la configuration de la directive mbstring dans PHP.INI. Il a fallu beaucoup de temps pour la comprendre progressivement.
Je comprends le paramètre mbstring.langue comme UTF-8
mbstring.internal_encoding Cet encodage n'a rien à voir avec l'encodage des fichiers PHP. C'est juste que dans la plupart des fonctions mbstring, vous devez spécifier l'encodage de la chaîne à traiter. Si vous ne le spécifiez pas explicitement, la valeur de ce paramètre le sera. être obtenu par défaut. La valeur de ce paramètre est utilisée dans les versions supérieures de PHP à la place.
mbstring.http_input Ce paramètre spécifie le codage par défaut pour l'entrée HTTP (à l'exclusion des paramètres GET). Généralement conforme à l'encodage de la page HTML, la valeur de ce paramètre est remplacée par le paramètre default_charset.
mbstring.http_output Ce paramètre m'a induit en erreur. Qu'est-ce que la sortie HTTP ? La sortie PHP n'est-elle pas simplement une page ?
mbstring.encoding_translation, concentrons-nous sur ce paramètre. Il est désactivé par défaut. S'il est activé, PHP convertira automatiquement l'encodage de la variable POST et le nom du fichier téléchargé en la valeur spécifiée par mbstring.internal_encoding. , je ne l'ai pas testé. Vous pouvez télécharger un fichier nommé chinois. Il est recommandé de le fermer et de laisser les programmeurs gérer les problèmes associés.
Regardons plus tard quelques fonctions étendues par mbstring :
mb_http_input() : détecte le codage des caractères d'entrée HTTP et juge qu'il est nécessaire de traiter le nom de fichier du téléchargement de fichier.
mb_convert_encoding() : Une fonction couramment utilisée, faites attention au troisième paramètre.
mb_detect_order() : définit/obtient l'ordre de détection du codage des caractères.
mb_list_encodings() : renvoie la liste de codage prise en charge par le système.
Remarque importante : les fichiers PHP doivent prendre en charge certains encodages et doivent être compatibles ASCII.
Mais n'utilisez pas BIG-5 comme encodage de fichier PHP, surtout si la chaîne apparaît sous la forme d'identifiants ou de littéraux. Si l'encodage réel du fichier PHP est BIG-5, essayez de convertir le contenu d'entrée et de sortie en UTF-8. .
Enfin, parlons du concept de Zend Multibyte. Je ne le comprends pas très bien. Tout d'abord, ne le confondez pas avec l'extension mbstring. Le mode Zend Multibyte est désactivé par défaut et peut être activé via la commande zend.multibyte. Spécifiez ensuite l'encodage de l'analyseur PHP via la fonction declare().
Alors quelle est la signification de cette instruction ? Comme mentionné ci-dessus, l'encodage des fichiers PHP doit être compatible ASCII, alors que faire avec des encodages ASCII incompatibles comme BIG-5. Vous pouvez l'utiliser via cette commande lorsque l'analyseur PHP lit l'encodage mbstring.script_encoding et l'utilise. encodage pour analyser les fichiers PHP.
Ce qui précède est une explication détaillée des chaînes, des encodages et des codes UTF-8 en PHP. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !