Использование str_split для строки в кодировке UTF-8 - PullRequest
46 голосов
/ 19 октября 2011

В настоящее время я работаю над проектом, и вместо использования обычных запросов 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, мой файл phpis utf-8 без спецификации , и никакие другие специальные символы на этой странице не разделяют эту проблему.Что может быть не так или что я делаю не так?

Ответы [ 7 ]

152 голосов
/ 28 июня 2012

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

$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
12 голосов
/ 19 октября 2011

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

10 голосов
/ 22 января 2017

UTF-8 При использовании PDO

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

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

'http://www.elated.com/articles/cms-in-an-afternoon-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 голосов
/ 19 октября 2011

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

3 голосов
/ 30 июля 2015

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

убедитесь, что база данных, 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 словами.

2 голосов
/ 17 января 2017

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

1.Как сохранить UTF-8 Charterers (математическая строка, специальные символы, такие как 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();
0 голосов
/ 02 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...