Подтвердить что ты не робот

Использование str_split для строки в кодировке UTF-8

В настоящее время я работаю над проектом, и вместо обычных запросов MySQL я решил пойти дальше и научиться использовать PDO.

У меня есть таблица с именами конкурсантов, база данных, таблица и все столбцы находятся в utf-8. У меня есть десять записей в таблице участников, и их столбец "имя" содержит такие символы, как ääö.

Теперь, когда я извлекаю запись из базы данных и изменяю имя var_dump, я получаю хороший результат - строку со всеми неповрежденными специальными символами. Но мне нужно разделить строку по символам, чтобы получить их в массиве, который я затем перемешаю.

Например, у меня есть эта строка: Test ÅÄÖ Tåän

И когда я запускаю str_split, я получаю каждый символ в своем собственном ключе в массиве. Единственная проблема заключается в том, что все специальные символы отображаются следующим образом: , что означает, что массив будет выглядеть так:

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
)

Как видите, он не только портит символы, но и дублирует их в процессе str_split. Я пробовал несколько способов разбить строку, но все они имеют одну и ту же проблему. Когда я вывожу строку перед разделением, она хорошо показывает специальные символы.

Это мой код dbConn.php:

//Требуется файл конфигурации: 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);

И это код, который я использую для извлечения из базы данных и цикла:

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

Я соединяюсь с utf-8, мой php файл - utf-8 без спецификации, и никакие другие специальные символы на этой странице не разделяют эту проблему. Что может быть не так или что я делаю не так?

4b9b3361

Ответ 1

str_split не работает с многобайтовыми символами, он возвращает только первый байт - таким образом, аннулирование ваших символов. вы можете использовать mb_split.

Ответ 2

Помните, что объявление utf8, используемое в вашей строке подключения, как сообщается, не работает. В комментариях на php.net я часто вижу эту альтернативу:

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

Ответ 3

UTF-8 с использованием PDO

проблемы при записи международных (даже китайских и таиландских) символов в базу данных

может быть больше способов сделать эту работу. Я не эксперт, просто технический специалист, заинтересованный в понимании всего этого. В Linux и Windows я установил несколько CMS (системы управления контентом), используя пример со следующего веб-сайта:

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

Образец использует PDO для вставки, обновления и удаления.

Мне понадобилось несколько часов, чтобы найти решение. Что бы я ни делал, я всегда заключал различия между данными в моих формах и в phpmyadmin/heidi -views

Я следовал подсказкам: " https://mathiasbynens.be/notes/mysql-utf8mb4 ", но успеха все равно не было

В моей CMS-структуре есть файл "Config.php": после прочтения этой веб-страницы я изменил строку

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

в

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

Теперь все работает отлично.

Ответ 4

Функция str_split разделяется байтом, а не символом. Вам понадобится mb_split.

Ответ 5

эта работа для меня... надеюсь, что это полезно.

убедитесь, что база данных, apache и каждый конфиг были в utf8.

ОБЪЕКТ 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);

он работает, если не используется другая функция, такая как str_word_count.

ИСПОЛЬЗОВАНИЕ str_word_count вам нужно использовать 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));
    }
}
Функция

возвращает строку с 20 словами.

Ответ 6

UTF-8 ПРОБЛЕМЫ И РЕШЕНИЯ ФУНКЦИЯМИ PHP

1. Как сохранить фрахтователи UTF-8 (математическая строка, специальные символы типа 92 ÷ 8 ÷ 2 =?)?

Отв. $ string = utf8_encode ('92 ÷ 8 ÷ 2 =? ');

2. Как напечатать фрахтователи UTF-8 из базы данных?

Отв. echo utf8_decode ($ string);

Примечание. Если вы не хотите делать это с помощью кодирования/декодирования, вы можете сделать это с помощью.

1. если вы используете mysqli_query(), то

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

2. Если вы используете 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();

Ответ 7

У меня были проблемы только с текстовыми полями в моей структуре базы данных, хранящими описания продуктов. Я установил настройки поля для blob вместо текста, что решило мою проблему.