existe une manière dans PHP de détecter le caractère suivant Je corrige actuellement un certain nombre de problèmes de codage UTF-8 avec quelques algorithmes différents et doivent être Capable de détecter si Il suffit de contourner le caractère dans mon codebase ne semble pas fonctionner. P> � code>?
� code> est présent dans une chaîne. Comment puis-je le faire avec
Stros code>? P>
if (strpos($names['decode'], '?') !== false || strpos($names['decode'], '�') !== false)
4 Réponses :
Autant que je sache, ce symbole de point d'interrogation n'est pas un seul caractère. Il existe de nombreux codes de caractères dans les ensembles de polices standard qui ne sont pas mappés sur un symbole, ce qui est le symbole par défaut utilisé. Pour la détection dans PHP, vous devez d'abord savoir de savoir quelle police c'est que vous utilisez. Ensuite, vous devez regarder la mise en œuvre de la police et voir les gammes de codes plan pour le "?" symbole, puis voir si le caractère donné est dans l'une de ces gammes. P>
En fait, c'est un caractère particulier: c'est u + fffd, "caractère de remplacement unicode" - il peut se produire lorsque certains systèmes ne pouvaient pas décoder les données à ce point (et le remplacer par ce caractère) ou si vous n'avez tout simplement pas la police. Mieux vaut regarder les données et voir quelles données avez-vous réellement.
Je suppose que c'est ce que je voulais dire par "gammes" de données qui ne décode pas correctement.
Conversion d'une chaîne de caractères UTF-8 en UTF-8 en utilisant cas de test (assurez-vous que vous enregistrez le fichier au format UTF-8). P> iconv () code> en utilisant le
// IGNORE code> paramètre produit un résultat où sont déposés caractères UTF-8 non valides. par conséquent, vous pouvez détecter un caractère cassé en comparant la longueur de la chaîne avant et après l'opération de iconv. Si elles diffèrent, ils contenaient un caractère cassé p>
<?php
header("Content-type: text/html; charset=utf-8");
$teststring = "Düsseldorf";
// Deliberately create broken string
// by encoding the original string as ISO-8859-1
$teststring_broken = utf8_decode($teststring);
echo "Broken string: ".$teststring_broken ;
echo "<br>";
$teststring_converted = iconv("UTF-8", "UTF-8//IGNORE", $teststring_broken );
echo $teststring_converted;
echo "<br>";
if (strlen($teststring_converted) != strlen($teststring_broken ))
echo "The string contained an invalid character";
Notez que le "// ignore" code> option peut échouer sur les versions récentes de la bibliothèque Libiconv , mais vous pouvez utiliser cette solution de contournement:
ini_set ('mbstring.substitut_character', "Aucun"); $ testtring_converted = mb_convert_encoding ($ string, 'utf-8', 'utf-8'); code>
Voici ce que je fais pour détecter et corriger le codage des chaînes non codées dans UTF-8 quand c'est ce que j'attends:
$encoding = mb_detect_encoding($str, 'utf-8, iso-8859-1, ascii', true); if (strcasecmp($encoding, 'UTF-8') !== 0) { $str = iconv($encoding, 'utf-8', $str); }
J'utilise la méthode personnalisée (en utilisant str_replace code>) pour assainir les caractères non définis:
$input='a³';
$text=str_replace("\n\n", "sample000" ,$text);
$text=str_replace("\n", "sample111" ,$text);
$text=filter_var($text,FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW);
$text=str_replace("sample000", "<br/><br/>" ,$text);
$text=str_replace("sample111", "<br/>" ,$text);
echo $text; //outputs ------------> a3
C'est la mauvaise approche. Vous devriez ajouter plus d'informations sur ce que vous faites, il y a probablement de meilleurs moyens de faire ce que vous voulez
Dernier essai avec ce 0x00? Voir FileFormat.info/info/unicode/char/0000/index.htm
Eric: Nope. PEKKA: Certaines chaînes gênantes sont en double codées et en décodent, quand? ou � est renvoyé alors la chaîne n'est pas codée double. Incertain de savoir comment détecter.
@James je suppose que l'approche
0x00 code> n'a pas fonctionné?
Même si la comparaison
== code> (lâche) du caractère � 0x00 réussit à une personne, il ne peut pas être utilisé pour la détection de caractères depuis la comparaison
== code> 0x00 passera également si comparé au
"" code> ou
"0" code>. Vous devez utiliser la comparaison
=== code> (strict) du caractère � avec 0x00 qui échouera probablement.