it-swarm-id.com

Menggunakan str_split pada string yang dikodekan UTF-8

Saat ini saya sedang mengerjakan sebuah proyek, dan alih-alih menggunakan pertanyaan MySQL biasa, saya pikir saya akan melanjutkan dan belajar cara menggunakan PDO.

Saya memiliki tabel yang disebut kontestan, baik database, tabel, dan semua kolom berada di utf-8. Saya memiliki sepuluh entri di tabel kontestan, dan kolom "nama" mereka berisi karakter seperti åäö.

Sekarang, ketika saya mengambil entri dari database, dan var_dump nama, saya mendapatkan hasil yang bagus, string dengan semua karakter khusus tetap utuh. Tapi yang perlu saya lakukan adalah membagi string dengan karakter, untuk mendapatkannya dalam array yang kemudian saya acak.

Sebagai contoh, saya memiliki string ini: Test ÅÄÖ Tåän

Dan ketika saya menjalankan str_split saya mendapatkan setiap karakter di dalamnya sendiri dalam sebuah array. Satu-satunya masalah adalah semua karakter khusus ditampilkan sebagai ini: �, artinya array akan seperti ini:

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
)

Seperti yang Anda lihat, itu tidak hanya mengacaukan karakter, tetapi juga menduplikasi mereka dalam proses str_split. Saya sudah mencoba beberapa cara untuk memisahkan string, tetapi mereka semua memiliki masalah yang sama. Ketika saya menampilkan string sebelum pemisahan, itu menunjukkan karakter khusus dengan baik.

Ini adalah kode dbConn.php saya:

// Membutuhkan file konfigurasi: 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);

Dan ini adalah kode yang saya gunakan untuk mengambil dari database dan 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);

Saya terhubung dengan utf-8, file php saya utf-8 tanpa BOM dan tidak ada karakter khusus pada halaman ini yang membagikan masalah ini. Apa yang bisa salah, atau apa yang saya lakukan salah?

46
Jonathan

str_split tidak berfungsi dengan karakter multi-byte, itu hanya akan mengembalikan byte pertama - sehingga membatalkan karakter Anda. Anda bisa menggunakan mb_split .

12

Harap diingat bahwa pernyataan utf8 yang digunakan dalam string-koneksi Anda dilaporkan tidak berfungsi. Dalam komentar di php.net saya sering melihat alternatif ini:

$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 Menggunakan PDO

masalah saat menulis karakter internasional (bahkan Cina dan Thailand) ke basis data

mungkin ada lebih banyak cara untuk membuat ini berfungsi. Saya bukan ahli, hanya orang aneh teknologi, tertarik untuk memahami semua ini. Di Linux dan Windows saya telah menyiapkan beberapa CMS (sistem pengelolaan konten), menggunakan sampel dari situs web berikut:

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

Sampel menggunakan PDO untuk memasukkan, memperbarui, dan menghapus.

Butuh beberapa jam untuk menemukan solusi. Apa pun yang saya lakukan, saya selalu menyimpulkan perbedaan antara data dalam formulir saya dan dalam tampilan phpmyadmin/heidi

Saya mengikuti petunjuk dari: ' https://mathiasbynens.be/notes/mysql-utf8mb4 ' tetapi masih belum berhasil

Dalam struktur CMS saya ada file 'Config.php': Setelah membaca halaman web ini saya mengubah baris

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

untuk

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

Sekarang semuanya bekerja dengan baik.

10
MikeOffenbach

str_split fungsi dibagi oleh byte, bukan oleh karakter. Kamu akan membutuhkan mb_split .

4
awm

ini bekerja untuk saya ... semoga bermanfaat.

pastikan bahwa database, Apache dan setiap konfigurasi ada di utf8.

OBYEK PDO

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

itu berfungsi jika tidak menggunakan fungsi lain seperti str_Word_count.

MENGGUNAKAN str_Word_count Anda perlu menggunakan 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));
    }
}

fungsi mengulang kembali string dengan 20 kata.

3
Strapicarus

MASALAH & SOLUSI UTF-8 oleh PHP FUNGSI)

1. Bagaimana Cara Menyimpan Penyewa UTF-8 (string matematika, karakter khusus seperti 92 ÷ 8 ÷ 2 =?)?

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

2. Bagaimana cara mencetak Penyewa UTF-8 Dari Database?

Ans. echo utf8_decode ($ string);

Catatan: Jika Anda tidak ingin melakukan ini dengan menggunakan encoding/decoding Anda dapat melakukannya melalui.

1. jika Anda menggunakan mysqli_query () maka

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

2.Jika Anda menggunakan PDO maka

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

Saya hanya punya masalah dengan bidang teks dalam struktur database saya, menyimpan deskripsi produk. Saya mengatur pengaturan bidang ke gumpalan alih-alih teks, yang memecahkan masalah saya.

0
Michael Wegman