PDO utf-8字符问题

Jon*_*han 46 php string utf-8

我目前正在开发一个项目,而不是使用常规的MySQL查询,我认为我会继续学习如何使用PDO.

我有一个名为参赛者的桌子,数据库,桌子和所有栏目都在utf-8中.我在参赛者表中有十个参赛作品,他们的专栏"名称"包含åäö等人物.

现在,当我从数据库中获取一个条目,并且var_dump名称时,我得到一个好结果,一个包含所有特殊字符的字符串.但我需要做的是按字符分割字符串,将它们放入一个我随后洗牌的数组中.

例如,我有这个字符串: 测试ÅÄÖ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
)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它不仅会弄乱角色,而且还会在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);
Run Code Online (Sandbox Code Playgroud)

这是我用来从数据库和循环中获取的代码:

// 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);
Run Code Online (Sandbox Code Playgroud)

我正在使用utf-8连接,我的php文件是utf-8,没有BOM,此页面上没有其他特殊字符共享此问题.可能有什么不对,或者我做错了什么?

Leo*_*Leo 152

请注意,连接字符串中使用的utf8声明报告不起作用.在php.net的评论中,我经常看到这个替代方案:

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

  • +1,只是一个快速说明:我的服务器需要`...; charset = utf8` (10认同)

Wes*_*orp 12

str_split不能使用多字节字符,它只返回第一个字节 - 从而使您的字符无效.你可以用mb_split.


小智 10

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);
Run Code Online (Sandbox Code Playgroud)

    define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings;charset=utf8');
Run Code Online (Sandbox Code Playgroud)

现在一切正常.