Ответ 1
str_split
не работает с многобайтовыми символами, он возвращает только первый байт - таким образом, аннулирование ваших символов. вы можете использовать mb_split
.
В настоящее время я работаю над проектом, и вместо обычных запросов 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 без спецификации, и никакие другие специальные символы на этой странице не разделяют эту проблему. Что может быть не так или что я делаю не так?
str_split
не работает с многобайтовыми символами, он возвращает только первый байт - таким образом, аннулирование ваших символов. вы можете использовать mb_split
.
Помните, что объявление utf8, используемое в вашей строке подключения, как сообщается, не работает. В комментариях на php.net я часто вижу эту альтернативу:
$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
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');
Теперь все работает отлично.
Функция str_split
разделяется байтом, а не символом. Вам понадобится mb_split
.
эта работа для меня... надеюсь, что это полезно.
убедитесь, что база данных, 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 словами.
1. Как сохранить фрахтователи UTF-8 (математическая строка, специальные символы типа 92 ÷ 8 ÷ 2 =?)?
Отв. $ string = utf8_encode ('92 ÷ 8 ÷ 2 =? ');
2. Как напечатать фрахтователи UTF-8 из базы данных?
Отв. echo utf8_decode ($ string);
Примечание. Если вы не хотите делать это с помощью кодирования/декодирования, вы можете сделать это с помощью.
$conn = mysqli_connect('localhost','db_username','password','your_database_name');
mysqli_set_charset($conn,"utf8");
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();
У меня были проблемы только с текстовыми полями в моей структуре базы данных, хранящими описания продуктов. Я установил настройки поля для blob вместо текста, что решило мою проблему.