2017-06-21 2 views
1

Nous devons importer des fichiers CSV vers MySQL contenant des trémas mal écrits. Par exemple, au lieu de Ü (ASCII 154), quelqu'un avec un clavier non allemand a entré U (ASCII 85) et a ajouté deux premiers points en utilisant ASCII 249, qui lui a semblé la même chose. MySQL écrit ceci comme U? dans la base de données.détecter les mauvais trémas écrits

C'est pourquoi nous voulons que PHP détecte les combinaisons de caractères non ASCII, comme cette combinaison d'un caractère ASCII imprimable et d'un caractère ASCII étendu, qui n'existe pas dans le monde réel, du moins pas dans les langues principales.

Les fonctions preg_replace que nous avons essayées, ne détectent pas cela et ne détectent pas non plus les trémas.

Une chance de réussir avec preg_replace ou est-ce un autre moyen?

+1

Vous pouvez faire correspondre ces combinaisons avec 'preg_match_all ('~ \ p {L} \ p {M} + ~ u', $ s, $ m)'. Mais je doute que vous puissiez facilement les remplacer par la lettre Unicode large char correspondant. Peut-être, vous avez besoin d'un mappage de lettre multibyte à large char. –

+0

Lorsque vous lisez un fichier texte, y compris CSV, vous devez utiliser le codage de caractères utilisé par l'enregistreur. Alors, quel est le codage du fichier CSV? (ASCII n'a pas une unité de code ou un point de code numéroté 154 ou 249.) Est-ce [IBM850] (https://en.wikipedia.org/wiki/Western_Latin_character_sets_ (calcul) #Comparison_table)? Une fois le texte lu correctement, vous pouvez remplacer les représentations incorrectes de chaque caractère tréma ("U" par "Ü"). –

Répondre

1

Puisque vous voulez utiliser le code PHP pour détecter toute combinaison d'une lettre de base suivie avec 1 ou plusieurs symboles diacritiques, vous pouvez utiliser

if (preg_match('~\p{L}\p{M}~u', $s, $m)) { 
    echo "There is a multibyte char here: " . $m[0]; 
} 

Notez que:

  • \p{L} - Autorise tout Unicode letter
  • \p{M} - correspond à tout symbole diacritique (une marque de combinaison)

Le modificateur u active les indicateurs PCRE (*UTF) et (*UCP) qui permettent au moteur PCRE de traiter à la fois la chaîne et le modèle dans un mode compatible Unicode.

+1

Encore mieux! :-) – user2113177

0

est ici quelque chose qui fonctionne potentiellement:

$contents = str_replace(chr(85).chr(249),chr(154), file_get_contents("mycsv.csv")); 

Ensuite, faites le commutateur chose recommandé votre base de données UTF-8 et à faire:

$utfText = mb_convert_encoding($contents,"UTF-8","ISO-8859-1"); //I think that's the ISO standard you are referring to 
+0

Merci. Mais la seule chose dont nous avons besoin est une validation. Il suffit donc d'avertir l'utilisateur si des caractères non standard sont détectés. – user2113177

+0

'strpos (file_get_contents (" mycsv.csv "), chr (85) .chr (249))! == false' retournerait' true' si la chaîne contient le caractère 85 suivi du caractère 249.Cependant, ma suggestion de conversion UTF-8 reste car il semble qu'il utilise actuellement un jeu de caractères qui ne fonctionne pas avec ce que vous lui donnez. – apokryfos

0

Wiktor (premier commentaire) clouant.

Nous n'avons pas besoin de remplacer, juste un avertissement est bon pour nous, car c'est un cas rare qui devrait être corrigé dans le fichier CSV quand même.

'~\p{L}\p{M}+~u' 

fait le travail.

+0

Si cela fonctionne pour vous, je peux poster une réponse complète avec des explications moi-même. "Le travail" n'est pas vraiment un type de réponse utile. Voir ma réponse ci-dessous. –