我有页面,从不同数据库(可能具有不同字符集)加载数据。
问题是,它以残破的字符集加载到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/)
现在,乐趣开始了:
不仅我得到了错误的输出,而且浏览器和错误日志也有不同的输出。
存储在数据库中的原始字符串:
FIREFOX反应:
原版的:
utf8_encode:
iconv:
与utf8_encode相同
现在,如何将其加载到php错误文件中:
如您所见,输出在原始形状中效果最好,而如果尝试转换,则输出变形更大。还尝试将错误日志文件字符集更改为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即可看到。
注意:分析可能不是获得所见即所得的唯一方法。