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

我目前正在研究一个项目,而不是使用常规的MySQL查询,我想继续学习如何使用PDO。

我有一个称为参赛者的表,数据库,表和所有列均位于utf-8中。 我的参赛者表中有10个条目,它们的“名称”列包含åäö等字符。

现在,当我从数据库中获取一个条目并使用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
)

如您所见,它不仅弄乱了字符,而且还在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,并且此页面上的其他特殊字符也没有共享此问题。 可能出什么问题了,或者我做错了什么?

Jonathan asked 2020-06-27T05:54:28Z
7个解决方案
152 votes

请注意,据报告您的连接字符串中使用的utf8声明无效。在php.net上的评论中,我经常看到这种选择:

$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
Leo answered 2020-06-27T05:55:06Z
12 votes

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

Wesley van Opdorp answered 2020-06-27T05:54:44Z
10 votes

使用PDO的UTF-8

将国际字符(中文和泰国事件)写入数据库时的问题

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

'[HTTP://呜呜呜.elated.com/articles/CMS-in-按-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');

现在一切正常。

MikeOffenbach answered 2020-06-27T05:56:06Z
4 votes

mb_split函数按字节而不是按字符拆分。 您将需要mb_split

awm answered 2020-06-27T05:56:29Z
3 votes

这项工作对我来说...希望有用。

确保数据库,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个单词的字符串。

Strapicarus answered 2020-06-27T05:57:11Z
2 votes

PHP函数提供的UTF-8问题与解决方案

1.如何保存UTF-8宪章(数学字符串,特殊字符,如92÷8÷2 =?)?

Ans。 $ string = utf8_encode('92÷8÷2 =?');

2.如何从数据库中打印UTF-8租船合同?

Ans。 回声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();
Shailesh Dwivedi answered 2020-06-27T05:58:02Z
0 votes

在我的数据库结构中,存储产品说明的文本字段只有问题。 我将字段设置设置为Blob而不是文本,这解决了我的问题。

Michael Wegman answered 2020-06-27T05:58:23Z
translate from https://stackoverflow.com:/questions/7822461/using-str-split-on-a-utf-8-encoded-string