对 UTF-8 编码字符串使用str_split

2022-08-30 11:04:23

我目前正在研究一个项目,而不是使用常规的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没有BOM,此页面上没有其他特殊字符共享此问题。可能出了什么问题,或者我做错了什么?


答案 1

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

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

答案 2

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


推荐