web-dev-qa-db-fra.com

Utilisation de str_split sur une chaîne codée UTF-8

Je travaille actuellement sur un projet, et au lieu d'utiliser des requêtes MySQL régulières, j'ai pensé aller de l'avant et apprendre à utiliser PDO.

J'ai une table appelée concurrents, la base de données, la table et toutes les colonnes sont en utf-8. J'ai dix entrées dans le tableau des candidats, et leur colonne "nom" contient des caractères tels que åäö.

Maintenant, lorsque je récupère une entrée de la base de données et que var_dump le nom, j'obtiens un bon résultat, une chaîne avec tous les caractères spéciaux intacts. Mais ce que je dois faire, c'est diviser la chaîne par caractères, pour les placer dans un tableau que je mélange ensuite.

Par exemple, j'ai cette chaîne: Test ÅÄÖ Tåän

Et quand je lance str_split, j'obtiens chaque caractère dans sa propre clé dans un tableau. Le seul problème est que tous les caractères spéciaux s'affichent comme ceci: �, ce qui signifie que le tableau sera comme ceci:

Array
(
    [0] => T
    [1] => e
    [2] => s
    [3] => t
    [4] =>  
    [5] => �
    [6] => �
    [7] => �
    [8] => �
    [9] => �
    [10] => �
    [11] =>  
    [12] => T
    [13] => �
    [14] => �
    [15] => �
    [16] => �
    [17] => n
)

Comme vous pouvez le voir, non seulement il gâche les caractères, mais il les duplique également dans le processus str_split. J'ai essayé plusieurs façons de diviser la chaîne, mais elles ont toutes le même problème. Lorsque je sors la chaîne avant la division, elle montre très bien les caractères spéciaux.

Voici mon code dbConn.php:

// Fichier de configuration requis: require_once ('config.inc.php');

// Start PDO connection:
$dbHandle = new PDO("mysql:Host=$dbHost;dbname=$dbName;charset=utf-8", $dbUser, $dbPass);
$dbHandle -> exec("SET CHARACTER SET utf8");

// Set error reporting:
$dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

Et voici le code que j'utilise pour récupérer dans la base de données et la boucle:

// Require files:
require_once('dbConn.php');

// Get random artist:
$artist = $dbHandle->query("SELECT * FROM ".ARTIST_TABLE." WHERE id = 11 ORDER BY Rand() LIMIT 1");
$artist->setFetchMode(PDO::FETCH_OBJ);
$artist = $artist->fetch();
var_dump($artist->name);

// Split name:
$artistChars = str_split($artist->name);

Je me connecte avec utf-8, mon fichier php est utf-8 sans BOM et aucun autre caractère spécial sur cette page ne partage ce problème. Qu'est-ce qui pourrait être mauvais ou qu'est-ce que je fais mal?

46
Jonathan

str_split ne fonctionne pas avec les caractères multi-octets, il ne renverra que le premier octet, invalidant ainsi vos caractères. vous pouvez utiliser mb_split .

12
Wesley van Opdorp

Gardez à l'esprit que la déclaration utf8 utilisée dans votre chaîne de connexion ne fonctionnerait pas. Dans les commentaires sur php.net, je vois souvent cette alternative:

$dbHandle = new PDO("mysql:Host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
152
Leo

UTF-8 utilisant PDO

problèmes lors de l'écriture de caractères internationaux (même chinois et thaïlandais) dans la base de données

il peut y avoir plus de façons de faire fonctionner cela. Je ne suis pas un expert, juste un technophile, intéressé à comprendre tout cela. Sous Linux et Windows, j'ai mis en place quelques CMS (systèmes de gestion de contenu), en utilisant un échantillon du site Web suivant:

" http://www.elated.com/articles/cms-in-an-afternoon-php-mysql "

L'exemple utilise PDO pour insérer, mettre à jour et supprimer.

Il m'a fallu quelques heures pour trouver une solution. Quoi que je fasse, j'ai toujours conclu des différences entre les données dans mes formulaires et dans les vues phpmyadmin/heidi

J'ai suivi les indices de: ' https://mathiasbynens.be/notes/mysql-utf8mb4 ' mais il n'y a toujours pas eu de succès

Dans ma structure CMS il y a un fichier 'Config.php': Après avoir lu cette page web j'ai changé de ligne

    define( 'DB_DSN', 'mysql:Host=localhost;dbname=mythings);

à

    define( 'DB_DSN', 'mysql:Host=localhost;dbname=mythings;charset=utf8');

Maintenant, tout fonctionne bien.

10
MikeOffenbach

Le str_split la fonction se divise par octet, pas par caractère. Tu auras besoin mb_split .

4
awm

ce travail pour moi ... espérons qu'il sera utile.

assurez-vous que la base de données, Apache et chaque configuration étaient en utf8.

OBJET AOP

            $dsn = 'mysql:Host=' . Config::read('db.Host') . ';dbname=' . config::read('db.basename') .';charset=utf8'. ';port=' . Config::read('db.port') .';connect_timeout=15';
            $user = Config::read('db.user');
            $password = Config::read('db.password');
            $this->dbh = new PDO($dsn, $user, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
            $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

cela fonctionne si vous n'utilisez pas une autre fonction comme str_Word_count.

À l'aide de str_Word_count, vous devez utiliser utf8_decode (utf8_encode).

function cortar($str)
{
    if (20>$count=str_Word_count($str)) {
        return $str;
    }
    else
    {
        $array = str_Word_count($str,1,'.,-0123456789()+=?¿!"<>*ñÑáéíóúÁÉÍÓÚ@|/%$#¡');
        $s='';
        $c=0;
        foreach ($array as $e) {
            if (20>$c) {
                if (19>$c) {
                $s.=$e.' ';
                }
                else
                {
                $s.=$e;
                }               
            }
            $c+=1;
        }
        return utf8_decode(utf8_encode($s));
    }
}

la fonction renvoie la chaîne avec 20 mots.

3
Strapicarus

PROBLÈMES ET SOLUTIONS UTF-8 par PHP FONCTIONS

1. Comment enregistrer les affréteurs UTF-8 (chaîne mathématique, caractères spéciaux comme 92 ÷ 8 ÷ 2 =?)?

Rép. $ string = utf8_encode ('92 ÷ 8 ÷ 2 =? ');

2. Comment imprimer les affréteurs UTF-8 à partir de la base de données?

Rép. echo utf8_decode ($ string);

Remarque: Si vous ne souhaitez pas le faire en utilisant l'encodage/décodage, vous pouvez le faire via.

1. si vous utilisez mysqli_query () alors

$conn = mysqli_connect('localhost','db_username','password','your_database_name');
mysqli_set_charset($conn,"utf8"); 

2.Si vous utilisez PDO,

class Database extends PDO{
    function __construct() {
        parent::__construct("mysql:Host=localhost;dbname=your_db_name","gurutslz_root","Your_db_password",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    }
}
$conn=new Database();
2
Shailesh Dwivedi

Je n'ai eu que des problèmes avec les champs de texte dans ma structure de base de données, en stockant les descriptions de produits. J'ai défini les paramètres de champ sur blob au lieu de texte, ce qui a résolu mon problème.

0
Michael Wegman