Php 在UTF-8编码字符串上使用str_split
我目前正在做一个项目,我想我应该继续学习如何使用PDO,而不是使用常规的MySQL查询 我有一个名为Competities的表,数据库、表和所有列都在utf-8中。我在参赛者表中有十个条目,它们的“name”列包含像åäö这样的字符 现在,当我从数据库中获取一个条目,然后var_转储名称时,我得到了一个很好的结果,一个所有特殊字符都完好无损的字符串。但我需要做的是将字符串按字符分割,将它们放入一个数组中,然后洗牌 例如,我有以下字符串: TestÄåTån 当我运行str_split时,我会得到数组中每个字符自己的键。唯一的问题是所有特殊字符显示如下:�, 这意味着数组将如下所示:Php 在UTF-8编码字符串上使用str_split,php,string,utf-8,Php,String,Utf 8,我目前正在做一个项目,我想我应该继续学习如何使用PDO,而不是使用常规的MySQL查询 我有一个名为Competities的表,数据库、表和所有列都在utf-8中。我在参赛者表中有十个条目,它们的“name”列包含像åäö这样的字符 现在,当我从数据库中获取一个条目,然后var_转储名称时,我得到了一个很好的结果,一个所有特殊字符都完好无损的字符串。但我需要做的是将字符串按字符分割,将它们放入一个数组中,然后洗牌 例如,我有以下字符串: 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
)
正如您所看到的,它不仅会弄乱字符,还会在stru分割过程中复制字符。我尝试了几种方法来分割字符串,但它们都有相同的问题。当我在分割之前输出字符串时,它会很好地显示特殊字符
这是我的dbConn.php代码:
//需要配置文件:
一次需要_('config.inc.php')
这是我用来从数据库和循环中获取的代码:
// 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,并且此页面上没有其他特殊字符共享此问题。什么地方可能出错,或者我做错了什么?不适用于多字节字符,它只返回第一个字节-从而使字符无效。您可以使用。str\u split函数按字节而不是按字符分割。您需要。请注意,您的连接字符串中使用的utf8声明被报告为不起作用。 在php.net上的评论中,我经常看到以下备选方案:
$dbHandle = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
这是我的工作。。。希望它有用 确保数据库、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_解码(utf8_编码)
函数cortar($str)
{
如果(20>$count=str\u word\u count($str)){
返回$str;
}
其他的
{
$array=str|u word_count($str,1,,-0123456789()+=?!!*;
$s='';
$c=0;
foreach($e作为数组){
如果(20>c美元){
如果(19>$c){
$s.=$e.';
}
其他的
{
$s.=$e;
}
}
$c+=1;
}
返回utf8_解码(utf8_编码($s));
}
}
函数返回20字字符串。UTF-8 PHP函数的问题与解决方案
1.如何拯救UTF-8租船人(数学字符串,特殊字符,如92÷8÷2=?)?
Ans.$string=utf8_编码('92÷8÷2=?');
2.如何从数据库中打印UTF-8租船人?
Ans.回声utf8_解码($string);
注意:如果您不想使用编码/解码进行此操作,可以通过
1.如果您使用的是mysqli_query(),那么
2.如果您正在使用PDO,则
使用PDO的UTF-8 向数据库中写入国际(甚至是中文和泰国)字符时出现的问题 可能有更多的方法来实现这一点。我不是专家,只是一个技术怪胎,有兴趣了解所有这些。在Linux和Windows中,我使用以下网站的示例设置了一些CMS(内容管理系统): '' 该示例使用PDO进行插入、更新和删除 我花了几个小时找到了一个解决方案。无论我做什么,我总是总结出我表格中的数据与phpmyadmin/heidi-View中的数据之间的差异 我遵循了以下提示:'',但仍然没有成功 在我的CMS结构中有一个文件“Config.php”: 看完这个网页后,我换了一行
define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings);
到
define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings;charset=utf8');
现在一切正常。我的数据库结构中存储产品描述的文本字段只有问题。我将字段设置设置为blob而不是文本,这解决了我的问题。您告诉我,我尝试使用mb_split,但它似乎有效,尽管我找不到合适的regexp,所以我最终使用了preg_split。$artistChars=preg_split('/(?@Jonathan,您可以尝试
mb_ereg()
函数,谢谢:)我最终使用了preg_split,如下所示:$artistChars=preg_split('/(?+1),我遇到了一个类似的问题,数据库中的an_被显示为� 在php中。向我的PDO连接中添加该附加参数修复了该问题。+1,我花了4个小时终于找到了导致问题的原因。在使用了php手册示例中的确切连接脚本之后,这怎么可能是问题?我现在对php开发团队非常生气……非常感谢您的回复。一百万个“谢谢”和更多。有一个类似的问题(没有字符串分割),结果是错误的� 在字符之间。这修复了它。幸运的是,我直接找到了这个答案,省去了我很多的痛苦!在PDO部分应该是charset=utf8。这就成功了!在我非常谦虚的假装观点中,这应该是最好的答案。
$conn = mysqli_connect('localhost','db_username','password','your_database_name');
mysqli_set_charset($conn,"utf8");
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();
define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings);
define( 'DB_DSN', 'mysql:host=localhost;dbname=mythings;charset=utf8');