Maison > Article > développement back-end > Chaînes, encodage, UTF-8 en PHP
J'ai lu beaucoup d'articles sur le codage récemment, je vais donc le diviser en deux articles de blog pour parler des connaissances liées à "PHP, chaînes, encodage, UTF-8". la première moitié, divisée en deux. Il y a quatre sections principales de contenu, à savoir "Définition et utilisation des chaînes", "Conversion de chaînes", "Essence des chaînes PHP" et "Chaînes multi-octets". La première moitié est relativement basique.
Il existe quatre façons de définir des chaînes en PHP :
Chaînes de guillemets simples
Les chaînes entre guillemets simples sont similaires aux chaînes originales en Python, c'est-à-dire que les chaînes entre guillemets simples n'ont pas de fonction d'analyse de variables ni de fonction d'échappement de caractères spéciaux. Par exemple, $str='hellonworld', n n'a pas de fonction de nouvelle ligne.
Chaîne entre guillemets doubles
La chaîne entre guillemets doubles a une fonction d'analyse variable et une fonction d'échappement de caractères spéciaux que la chaîne entre guillemets simples n'a pas.
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} #十六进制表达方式
heredoc
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 de 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. Les variables peuvent être analysées en fonction du contexte au moment de l'exécution (il s'agit d'un langage interprété qui en produit plusieurs). des utilisations merveilleuses.
L'analyse simple des variables signifie que la chaîne peut contenir des "variables", des "tableaux" et des "attributs d'objet". Les règles de syntaxe complexes doivent utiliser des symboles {} pour fonctionner (pour former une expression).
Prenons un exemple pour voir la puissance de l'analyse des variables
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 , simplifiera de nombreuses opérations, qui sont expliquées ici via 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);
settype( ) La fonction est de définir 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 valeursen chaînes. Par exemple, a. La valeur booléenne de TRUE est convertie en "1" de chaîne. 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 ce à quoi il est plus important de prêter attention est la conversion de type automatique dans une expression qui nécessite une chaîne. , Il sera automatiquement converti 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 L'implémentation est 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 l'encodage de la chaîne. La façon dont la chaîne est encodé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 des fonctions non binaires de PHP sont appelées fonctions C en bottom, qui mettra NULL une fois les caractères ignorés.
Tant que l'encodage de fichier PHP est compatible avec ASCII, les opérations sur les chaînes peuvent être correctement traité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 encodées en un seul byte , mais ne nécessite 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 pas de problème, mais les situations suivantes peuvent ne pas l'être. géré. Voici :
Comment convertir des chaînes non codées en UTF-8
Une page Web codée en UTF-8, mais l'utilisateur soumet le formulaire Parfois, un encodage GBK peut être utilisé (n'est pas conforme à la balise méta)
Un fichier PHP encodé en UTF-8, utilisant strlen("China") renvoie 6 au lieu de les personnages réels Numéro (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 ce paramètre mbstring.langage comme UTF-8
mbstring.internal_encoding Cet encodage n'a rien à voir avec l'encodage de fichiers PHP In. 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 sera obtenue par défaut. La valeur de ce paramètre est remplacée par le paramètre default_charset dans les versions supérieures. de PHP.
mbstring.http_input Ce paramètre spécifie le codage par défaut de 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 la variable POST et le nom du fichier téléchargé en. la valeur spécifiée par mbstring.internal_encoding , mais je ne l'ai pas testée. Vous pouvez télécharger un fichier avec un nom 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 l'encodage des caractères d'entrée HTTP et pense qu'il s'agit du fichier. nom pour le téléchargement du fichier. Il est nécessaire de s'en occuper.
mb_convert_encoding() : Une fonction couramment utilisée, faites attention au troisième paramètre.
mb_detect_order() : Définir/obtenir l'ordre de détection de l'encodage des caractères.
mb_list_encodings() : renvoie la liste d'encodages 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 du fichier PHP est en fait BIG-5, essayez de convertir l'entrée et. afficher le contenu au format 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 ce commandement ? 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.