PHP: mb_strtoupper ne fonctionne pas
J'ai un problème avec l'encodage UTF-8 et mb_strtoupper.
mb_internal_encoding('UTF-8');
$guesstitlestring='Le Courrier de Sáint-Hyácinthe';
$encoding=mb_detect_encoding($guesstitlestring);
if ($encoding!=='UTF-8') $guesstitlestring=mb_convert_encoding($guesstitlestring,'UTF-8',$encoding);
echo "DEBUG1 $guesstitlestring\n";
$guesstitlestring=mb_strtoupper($guesstitlestring);
echo "DEBUG2 $guesstitlestring\n";
Résultat:
DEBUG1 Le Courrier de Sáint-Hyácinthe
DEBUG2 LE COURRIER DE S?INT-HY?CINTHE
Je ne comprends pas pourquoi ce qui se passe? Je vais essayer d'être aussi prudents que je peux avec l'encodage. La chaîne est donnée d'abord en tant que UTF-8, vérifié et possible reconverti en UTF-8. C'est un cauchemar!
Mise à JOUR
Donc j'ai pensé que cela a été causé par une combinaison de mon entrer dans les arguments via la console et les arguments de retour de la console. Donc, ils ont été tronquées à la fois sur la manière et le moyen de sortir. La solution est de ne pas entrer dans un des arguments de cette façon, ou d'obtenir les arguments de cette façon.
Merci à vous tous pour votre aide dans la résolution de ce problème!
Quel est l'encodage de votre .fichier php? Essayez de le convertir en utf-8 sans BOM.
... mh, essayez d'ajouter la fonction setlocale(LC_ALL, 'fr_fr.UTF-8'); au sommet
J'ai essayé de la sortie vers un fichier et de téléchargement du fichier, et son le même. @As, c'est exactement ça.
merci mais il n'a pas aidé.
OriginalL'auteur Alasdair | 2013-02-24
Vous devez vous connecter pour publier un commentaire.
Au lieu de
strtoupper()/mb_strtoupper()
utilisationmb_convert_case()
depuis majuscules conversion est très délicat à travers les différents encodages, assurez-vous que votre chaîne EST UTF-8.De travail exemple: http://3v4l.org/enEfm#v443
Voir aussi mon commentaire sur le site de PHP à propos du convertisseur: http://www.php.net/manual/function.utf8-encode.php#102382
á
est en minuscule dans la production?En français il n'y a pas de mot ayant un "á" par le moyen - avoir un "à", oui il y a des. Mais ce n'est pas le problème ici de toute façon...
trouvé la solution:
mb_convert_case()
vous avez tout mon exemple?
J'ai référencé votre code ici stackoverflow.com/questions/42480477/... et upvoted vous.
OriginalL'auteur powtac
Cela fonctionne pour moi, mais seulement quand le fichier php en lui-même est enregistré en UTF-8 et lorsque le terminal que je suis en attend UTF-8. Je pense que ce qui se passe pour vous, c'est que le fichier est enregistré en tant que ISO-8859-1 et que votre terminal est attendu ISO-8859-1.
D'abord,
mb_detect_encoding
ne fait pas travailler pour cette chaîne. Même lorsque le fichier PHP n'est pas de l'UTF-8, il rapporte encore comme de l'UTF-8.Lorsque vous imprimez le minuscule string, elle imprime ISO-8859-1 caractères et votre terminal affiche l'amende juste. Puis, quand vous convertir en majuscules à l'aide de l'UTF-8, il obtient de déformation.
J'ai créé deux versions de ce fichier. Je l'ai enregistré à l'aide de mon éditeur de texte en ISO-8859-1 comme
iso-8859-1.php
. Ensuite, j'ai utilisé iconv pour convertir l'ensemble du fichier en UTF-8 et enregistré commeutf-8.php
J'ai ajouté une ligne pour imprimer le résultat de l'encodage que mb_detect_encoding retourne.
De mon terminal s'attend effectivement texte UTF-8, donc quand j'imprime ISO-8859-1 texte, il obtient de déformation. Tout fonctionne correctement lorsque le fichier est enregistré en utf-8 et le terminal attend utf-8.
OK. Mais je ne peux pas le faire parce que la chaîne est donnée comme argument dans le script PHP sur la console. J'ai donc besoin d'un moyen de forcer en UTF-8 en quelque sorte de l'intérieur du script PHP déjà.
Voir ma réponse, je convertir la chaîne en UTF-8, quelle que soit la chaîne d'entrée est...
OriginalL'auteur Stephen Ostermiller
En fait, ce qui fonctionne ici est tout simplement
sorties
ici, il fonctionne directement, mais peut-être que dans votre cas, vous devez ajouter
utf8_encode
:--
Une alternative qui fonctionne ici sans MB,
Modifié la réponse.
OriginalL'auteur Ring Ø