在 UTF-8 编码的字符串上使用 str_split

Posted

技术标签:

【中文标题】在 UTF-8 编码的字符串上使用 str_split【英文标题】:Using str_split on a UTF-8 encoded string 【发布时间】:2011-12-10 23:15:59 【问题描述】:

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

我有一张表叫参赛者,数据库、表和所有的列都是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
)

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

【问题讨论】:

PDO部分应该是charset=utf8。 【参考方案1】:

请注意,您的连接字符串中使用的 utf8 声明被报告为无效。 在 php.net 上的 cmets 中,我经常看到这种替代方法:

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

【讨论】:

+1,我遇到了类似的问题,数据库中的 ü 在 php.ini 中显示为 �。将附加参数添加到我的 PDO 连接解决了这个问题。 +1,我花了 4 个小时才终于找到导致问题的原因。使用 PHP 手册示例中的确切连接脚本后,这怎么可能是问题所在?我现在对 PHP 开发团队很生气…… 哦,非常感谢您的回复。一百万个“谢谢”等等。 有一个类似的问题(没有字符串拆分),结果在字符之间有�。这解决了它。 幸好直接找到了这个答案,省了我不少苦!【参考方案2】:

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

【讨论】:

我确实尝试过使用 mb_split,现在你告诉我,它似乎工作,虽然我找不到合适的正则表达式,所以我最终使用了 preg_split。 $artistChars = preg_split('/(?name);虽然,现在我需要将所有字符都变成小写,而 mb_convert_case 也会把字符弄乱.. @Jonathan,你可以试试mb_ereg()函数,php.net/manual/en/function.mb-ereg.php【参考方案3】:

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);

    define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings;charset=utf8');

现在一切正常。

【讨论】:

成功了!在我非常谦虚的假装意见中,这应该是最好的答案。【参考方案4】:

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

【讨论】:

谢谢 :) 我最终像这样使用 preg_split: $artistChars = preg_split('/(?name);虽然,现在我需要将所有字符都变成小写,而 mb_convert_case 也会把字符弄乱..【参考方案5】:

这对我有用...希望它有用。

确保数据库、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 等其他函数,它也可以工作。

USING 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 个单词的字符串。

【讨论】:

【参考方案6】:

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

1.如何保存 UTF-8 Charterers(数学字符串,特殊字符,如 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,那么

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();

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于在 UTF-8 编码的字符串上使用 str_split的主要内容,如果未能解决你的问题,请参考以下文章

emwin编译器把UTF-8编码的字符串识别出有换行符,在VS上开发emwin有些中文字符报错

emwin编译器把UTF-8编码的字符串识别出有换行符,在VS上开发emwin有些中文字符报错

常见编码格式

Spring MVC UTF-8 编码

为啥 .net 对字符串使用 UTF16 编码,但默认使用 UTF-8 来保存文件?

UTF-8和GBK编码之间的区别(页面编码数据库编码区别)以及在实际项目中的应用