9
votes

Unicode inconnu "�" Détection de caractères en PHP

existe une manière dans PHP de détecter le caractère suivant � code>?

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 � code> est présent dans une chaîne. Comment puis-je le faire avec Stros code>? P>

Il suffit de contourner le caractère dans mon codebase ne semble pas fonctionner. P>

if (strpos($names['decode'], '?') !== false || strpos($names['decode'], '�') !== false)


5 commentaires

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 n'a pas fonctionné?


Même si la comparaison == (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 == 0x00 passera également si comparé au "" ou "0" . Vous devez utiliser la comparaison === (strict) du caractère � avec 0x00 qui échouera probablement.


4 Réponses :


1
votes

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.


2 commentaires

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.



19
votes

Conversion d'une chaîne de caractères UTF-8 en UTF-8 en utilisant 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>

cas de test (assurez-vous que vous enregistrez le fichier au format UTF-8). 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";


1 commentaires

Notez que le "// ignore" 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');



4
votes

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);
    }


0 commentaires

0
votes

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


0 commentaires