Met behulp van str_split op een UTF-8 encoded string

Ik ben momenteel bezig met een project, en in plaats van het gebruik van reguliere MySQL query ‘ s, ik dacht dat ik zou gaan en leren hoe BOB.

Ik heb een tabel met de naam van de deelnemers, zowel de database, de tafel, en alle van de kolommen worden in utf-8. Ik heb tien items in de deelnemer tafel, en hun kolom “naam” bevat tekens zoals åäö.

Nu, als ik halen een record uit de database, en var_dump de naam, krijg ik een goed resultaat, een string met alle speciale tekens intact. Maar wat ik moet doen, is op te splitsen in een string tekens, om hen in een matrix die ik schud daarna.

Bijvoorbeeld, ik heb deze tekenreeks:
Test ÅÄÖ Tåän

En wanneer ik str_split ik krijg elk teken in een eigen sleutel in een array. Het enige probleem is dat alle speciale tekens worden weergegeven als deze: lesweken, wat betekent dat de array zal als volgt zijn:

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
)

Zoals u kunt zien, het is niet alleen messes up van de personages, maar ook duplicaten ze in str_split proces. Ik heb geprobeerd een aantal manieren te splitsen van de reeks, maar ze hebben allemaal hetzelfde probleem. Als ik de uitgang van de tekenreeks voor het splitsen, het toont de speciale tekens prima.

Dit is mijn dbConn.php code:

//Moet config bestand:
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);

En dit is de code die ik gebruik om het op te halen uit de database en loop:

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

Ik verbinding maak met de utf-8, mijn php-bestand is utf-8 zonder BOM en geen andere speciale tekens op deze pagina deel dit probleem. Wat kan er fout zijn, of wat doe ik verkeerd?

  • Moet charset=utf8 in het BOB deel.
InformationsquelleAutor Jonathan | 2011-10-19



7 Replies
  1. 12

    str_split niet werkt met multi-byte tekens, wordt het alleen maar de terugkeer van de eerste byte – dus dat je personages. je zou kunnen gebruiken mb_split.

    • Ik heb proberen te gebruiken mb_split nu dat je me vertelde, en het leek te werken, maar ik kon het niet vinden van een juiste regexp dus uiteindelijk heb ik met behulp preg_split. $artistChars = preg_split(‘/(?<!^)(?!$)/u”, $kunstenaar->naam); Hoewel, nu moet ik bij het maken van de tekens in kleine letters, en mb_convert_case messes up van de karakters zo goed..
    • u kunt proberen de mb_ereg() functie, php.net/manual/en/function.mb-ereg.php
  2. 152

    Rekening mee dat de utf8 verklaring gebruikt in uw connect-string is naar verluidt niet werken.
    In de toelichting op php.net ik heb regelmatig dit alternatief:

    $dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
                        array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    • +1, even een opmerking: mijn server vereist ...;charset=utf8
    • +1, ik had een soortgelijk probleem waar een ü in de database wordt weergegeven als een lesweken in php. Het toevoegen van die extra parameter aan mijn BOB-verbinding het probleem opgelost.
    • +1, het kostte me 4 uur om eindelijk te weten wat het probleem veroorzaakt. Na het gebruik van de exacte script van de PHP-handleiding voorbeeld, hoe zou dat misschien het probleem? Ik ben zo boos op de PHP development team nu…
    • Oh dank u zo heel veel voor dit antwoord. Een miljoen “dank u”s en meer.
    • Had een soortgelijk probleem (geen string splitsen) waar resultaten had lesweken tussen de tekens. Dit bevestigd het.
    • Gelukkig vond ik dit antwoord direct, bespaarde me een hoop pijn!
    • +1 voor , array(PDO::MYSQL_ATTR_INIT_COMMAND => “SET NAMEN ‘utf8′”), je hebt mijn leven gered
    • Dank u meneer. 😀

  3. 10

    UTF-8 met Behulp van BOB

    problemen bij het schrijven van internationale (zelfs Chinese en Thailandic) tekens met de database

    kunnen er meer manieren zijn om dit werk te maken. Ik ben geen expert, maar een tech-freak, geïnteresseerd om dit alles te begrijpen. In Linux en Windows heb ik een paar CMS (content-beheer-systemen), het gebruik van een sample van de volgende website:

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

    Het monster wordt met behulp van BOB voor insert, update en delete.

    Het kostte me een paar uur om een oplossing te vinden. Wat ik ook deed, ik heb altijd gesloten verschillen tussen de gegevens in mijn formulieren en in de phpmyadmin/heidi -uitzicht

    Ik volgde de aanwijzingen van: ‘https://mathiasbynens.be/notes/mysql-utf8mb4‘ maar er was nog geen succes

    In mijn CMS-structuur is er een bestand ‘Config.php’:
    Na het lezen van deze webpagina, veranderde ik de lijn

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

    te

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

    Nu werkt allemaal prima.

    • Dat deed de truc! In mijn zeer bescheiden doen alsof mening, dit zou het beste antwoord.
  4. 4

    De str_split functie splitst door byte, niet door teken. Je moet mb_split.

    • Bedankt 🙂 uiteindelijk heb ik met behulp preg_split als volgt: $artistChars = preg_split(‘/(?<!^)(?!$)/u”, $kunstenaar->naam); Hoewel, nu moet ik bij het maken van de tekens in kleine letters, en mb_convert_case messes up van de karakters zo goed..
  5. 3

    dit werk voor mij… hoop dat het bruikbaar.

    zorg ervoor dat de database, apache en elke config was in utf8.

    BOB OBJECT

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

    het werk als niet met een andere functie zoals str_word_count.

    MET str_word_count moet u gebruik 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));
        }
    }

    functie returs string met 20 woorden.

  6. 2

    UTF-8 PROBLEMEN & OPLOSSINGEN door PHP FUNCTIES

    1. Hoe op te Slaan UTF-8 Bevrachters (wiskundige string,speciale tekens zoals 92 ÷ 8 ÷ 2 = ? ) ?

    Ans. $string =utf8_encode(’92 ÷ 8 ÷ 2 = ?’);

    2. Het afdrukken van UTF-8 Bevrachters Uit de Database ?

    Ans. echo utf8_decode($string);

    Opmerking: Als u niet wilt om dit te doen met behulp van codering/decodering u kunt dit doen via.

    1. als u mysqli_query() dan

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

    2.Als u BOB dan

    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();
  7. 0

    Ik had alleen problemen met tekstvelden in mijn database structuur, het opslaan van het product beschrijvingen. Ik stel de instellingen van het veld te blob in plaats van de tekst, die mijn probleem opgelost.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *