2013-01-08 6 views
4

S'il vous plaît, jetez un oeil à ceci:comportement string étrange avec '¡' caractère

$str = '¡hola!'; // '¡' is the spanish opening exclamation mark 

echo $str{0}; // prints nothing 
echo $str{1}; // prints � 
echo $str{2}; // prints h 

Le script php a l'encodage UTF-8 et j'obtenir les mêmes résultats d'exécution comme module apache ou CLI. Version PHP: 5.4.6

Pourquoi je reçois des résultats étranges?

+2

On dirait ¡est un caractère multi-octets .. pourquoi voulez-vous y accéder via ' [] '? –

+3

Chaînes multi-octets. '¡' Est un caractère de deux octets [00A1], ce qui explique pourquoi vous n'obtenez rien pour le premier octet, et les ordures pour le second. – Sammitch

+3

@Peter Ce n'est pas un problème de codage du navigateur, l'indexation d'une chaîne par [] ou {} n'est pas sûre à plusieurs octets. – dualed

Répondre

2

Cela est dû au fait que ¡est en réalité un caractère multi-octets en UTF, qui PHP ne gère pas correctement grâce à un accès réseau ([0]). Vous aurez envie de regarder dans les fonctions multi-octets au lieu: http://php.net/manual/en/book.mbstring.php

Cela devrait fonctionner comme prévu:

$str = '¡hola!'; 

echo mb_substr($str, 0, 1, 'UTF-8'); // prints ¡ 
echo mb_substr($str, 1, 1, 'UTF-8'); // prints h 
echo mb_substr($str, 2, 1, 'UTF-8'); // prints o 
4

L'indexation d'une chaîne par [] ou {} n'est pas sécurisée par plusieurs octets.

Utilisez-fonctions multi-octets au lieu, comme mb_substr