我有页面,从不同数据库(可能具有不同字符集)加载数据。
问题是,它以残破的字符集加载到UTF-8。
我需要找到一种方法,如何正确地加载它。

我的联系是:

$db = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


如您所见,我使用'SET NAMES utf8'

我在<meta charset="utf-8">中有<head>

我尝试了一些转换:

 error_log("ORGIGINAL: ".$row["title"]);
 error_log("ICONV: ".iconv(mb_detect_encoding($row["title"], mb_detect_order(), true), "UTF-8", $row["title"]));
 error_log("UTF_ENCODE: ".utf8_encode ($row["title"]));


我相信,我也已将所有文件加载到UTF-8中
(重新保存记事本中从ANSI到UTF-8的每个文件。然后尝试使用此工具进行验证https://nlp.fi.muni.cz/projects/chared/

现在,乐趣开始了:
不仅我得到了错误的输出,而且浏览器和错误日志也有不同的输出。

存储在数据库中的原始字符串:
php - PHP从数据库错误的字符集-LMLPHP

FIREFOX反应:

原版的:

php - PHP从数据库错误的字符集-LMLPHP

utf8_encode:

php - PHP从数据库错误的字符集-LMLPHP

iconv:
与utf8_encode相同

现在,如何将其加载到php错误文件中:
php - PHP从数据库错误的字符集-LMLPHP

如您所见,输出在原始形状中效果最好,而如果尝试转换,则输出变形更大。还尝试将错误日志文件字符集更改为UTF-8(可能是原始未知/ ANSI,但两种编码的形状相同)

文本为中欧/捷克语。
所需字符为:
ýóú
žčřňě

那么,有什么想法,哪里可能出问题了?

谢谢 :)

最佳答案

不要使用任何转换功能。

产生黑钻石的原因有两个:见Trouble with utf8 characters; what I see is not what I stored

错误文件显示Mojibake,或者可能是“双重编码”。这些也在上面的链接中进行了讨论。

检查Firefox是否将该页面解释为UTF8。较旧的版本并不一定要假设这样。

哦,我刚注意到一个简单的问号。 (也包含在链接中。)您赢得最多的奖项是在一个文件中处理UTF8!

这可能意味着存在多个错误。祝好运。如果您在各个阶段(在PHP中,在数据库表中等)提供数据的HEX,我可能可以提供更详细的帮助。

捷克字符集的一个问题是,在西欧子集中发现了某些字符(带有重音符号的字符),因此更有可能正确显示。其他口音大多针对捷克语(带有纸箱),并且走的路不同。这就解释了为什么您的某些样品会出现两种不同的失效情况。 (在此论坛上搜索捷克语;您可能会获得更多提示。)

经过一番实验...

?eské可能来自表中CHARACTER SET(或其他“拉丁”)列的latin1,并且在插入数据时将连接建立为latin1。可以在浏览器处于Western模式而不是utf8时在浏览器上看到。

如果执行上述操作,则会显示?esk�,并且在选择过程中还将latin1作为连接。将浏览器设置为utf8即可看到。

注意:分析可能不是获得所见即所得的唯一方法。

10-08 09:24