来自DB的php错误的charset

时间:2017-05-31 13:34:25

标签: php mysql encoding utf-8 character-encoding

我有页面,taht从不同的数据库(可能有不同的字符集)加载数据。 问题是,它加载了破坏的字符集到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/

现在,有趣的地方开始了: 不仅输出错误,我的浏览器和错误日志输出也不同。

存储在DB中的原始字符串: http://screenshot.cz/F7/F7XRF/sdb.png

FIREFOX反应:

原件:

http://screenshot.cz/TG/TG7RX/for.png

函数utf8_encode:

http://screenshot.cz/H9/H9IZJ/fu.png

的iconv: 与utf8_encode相同

现在,如何将其加载到php错误文件中: http://screenshot.cz/FY/FYXEE/el.png

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

文字是中欧/捷克。 需要的字符是: áíóú...... žščřďťňě

那么,任何想法,哪里可能出错?

谢谢:)

1 个答案:

答案 0 :(得分:0)

请勿使用任何转换功能。

黑钻有两个原因;见Trouble with utf8 characters; what I see is not what I stored

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

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

哦,我刚刚注意到了简单的问号。 (也在链接中有所说明。)你赢得了大部分奖项的奖项,只能在单个文件中修改UTF8!

这可能意味着发生了多个错误。祝好运。如果您在各个阶段(在PHP中,在数据库表中等)提供HEX数据,我可能会提供更多详细信息。

捷克字符集的一个问题是在西欧子集中发现了一些字符(具有急性重音的字符),因此更有可能正确呈现。其他口音主要针对捷克(带有卡通),并沿着不同的路径前进。这解释了为什么您的一些样品会出现两种不同的故障情况。 (在这个论坛上搜索捷克语;你可以提供更多提示。)

经过一些实验......

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

如果您执行上述操作,

?esk�会显示, 会在选择期间将latin1作为连接。浏览器设置为utf8时可以看到。

警告:分析可能不是获得所见内容的唯一途径。