PDO UTF-8字符问题

我目前正在做一个项目,而不是使用普通的MySQL查询,我想我会继续学习如何使用PDO。

我有一个叫做参赛者的表,数据库,表和所有的列都在utf-8中。 我在参赛桌上有十个参赛作品,他们的专栏“名字”中包含åäö等字。

现在,当我从数据库中获取一个条目,并且var_dump这个名字的时候,我得到了一个好的结果,一个包含所有特殊字符的string。 但是我需要做的是按字符分割string,把它们放到一个数组中,然后我就可以随机播放。

例如,我有这个string: testingÅÄÖ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过程中复制它们。 我已经尝试了几种方法来分割string,但它们都有相同的问题。 当我在分割之前输出string时,它显示特殊字符就好了。

这是我的dbConn.php代码:

//需要configuration文件: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, 没有BOM ,在这个页面上没有其他特殊字符分享这个问题。 什么可能是错的,或者我做错了什么?

在此先感谢// Jonathan

str_split不适用于多字节字符,它只会返回第一个字节 – 从而使您的字符无效。 你可以使用mb_split

请注意,连接string中使用的utf8声明报告不起作用。 在php.net的评论中,我经常看到这个select:

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

str_split函数按字节分割,而不是按字符分割。 你需要mb_split

这个工作对我来说…希望它有用。

确保数据库,Apache和每个configuration在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等其他function。

使用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个字修改string。

UTF-8使用PDO

国际(甚至中国和泰国)字符写入数据库时​​遇到问题

可能有更多的方法来完成这项工作。 我不是专家,只是一个技术怪胎,有兴趣了解这一切。 在Linux和Windows中,我使用以下网站的示例设置了一些CMS(内容pipe理系统):

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

该示例正在使用PDO进行插入,更新和删除。

我花了几个小时find一个解决scheme。 不pipe我做了什么,我总是总结出我的表格和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'); 

现在一切正常。

UTF-8的PHP函数的问题和解决scheme

1.如何保存UTF-8租船人(mathstring,特殊字符如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


    类数据库扩展PDO {
        函数__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();