2017-07-25 13 views
1

Je reçois une chaîne de la base de données, où il est codé avec utf8_unicode_ci. Il peut contenir le caractère de point central (⋅) et je dois savoir en utilisant strcmp. Si je montre directement la chaîne dans le HTML, le caractère est affiché sans problème mais quand je fais la comparaison, les résultats ne sont pas ce que j'attends.Comparer les chaînes avec le point du milieu ne fonctionne pas dans PHP

Par exemple:

$string = "⋅⋅⋅ This string starts with middle dots"; 
$result = strcmp(substr($string , 0, 2), "⋅⋅"); 

Les résultats n'est pas 0, comme je pense qu'il faut. Le fichier PHP est enregistré avec l'encodage UTF-8. Qu'est-ce que j'oublie ici? Cela se produit même si je prends la chaîne à partir d'une variable au lieu de la base de données

+2

Vous devez probablement utiliser les fonctions multi-octets. –

Répondre

1

La sous-chaîne de PHP ne prend pas les caractères Unicode sous la forme d'un seul caractère. Le dot you're using est en réalité 3 caractères, 0xE2 0x8B 0x85.

Donc, soit mb_substr utilisation, ou utilisez un autre décalage:

<?php 

$string = "⋅⋅⋅ This string starts with middle dots"; 
$result = strcmp(mb_substr($string , 0, 2), "⋅⋅"); 

var_dump($result); 

Ou si MB_ * fonctions n'existent pas:

<?php 

$string = "⋅⋅⋅ This string starts with middle dots"; 
$result = strcmp(substr($string , 0, 6), "⋅⋅"); 

var_dump($result); 
2

utilisation strpos - http://uk1.php.net/manual/en/function.strpos.php

cela renvoie une valeur int de la première occurrence de caractère spécifié. E.g .:

$myStr = '.. this is a string'; 
$find = '..'; 
$pos = strpos($myStr, $find); 

var_dump($pos); //will output 0; 

s'il n'est pas trouvé - il renvoie faux.

+0

Merci. Je vais utiliser 'mb_strpos' – ali

+0

@ali pas de soucis :) et ah bonne idée :) – ThisGuyHasTwoThumbs