PHP:UTF 8个字符编码

时间:2009-08-11 15:02:32

标签: php utf-8 curl simplexml

我正在使用cURL抓取RSS提要列表,然后我正在阅读并使用SimpleXML解析RSS数据。然后将排序后的数据插入到mySQL数据库中。

但是,正如http://dansays.co.uk/research/MNA/rss.php上的通知一样,我遇到了几个字符无法正确显示的问题。

示例:

âGuitar Hero: Van Halenâ Trailer And Tracklist Available

NV 10/10/09 – Salt Lake City, UT 10/11/09 – Denver, CO 10/13/09 –

我尝试在将数据插入数据库之前对数据使用htmlentities和htmlspecialchars,但它似乎无助于解决问题。

我怎么可能解决这个问题?

感谢您的任何建议。

更新

我已经尝试过格雷格的建议,问题仍然存在......

以下是我在PDO中执行SET NAMES的代码:

$dbh = new PDO($dbstring, $username, $password); 

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$dbh->query('SET NAMES "utf8"');

在对simplexml数据进行排序并插入数据库之前,我对它进行了一些回应,我现在相信它与cURL有关......

以下是我对cURL的看法:

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');

$data = curl_exec($ch);

curl_close($ch);

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

问题已解决

我必须将RSS / HTML页面中的内容字符集设置为“UTF-8”才能解决此问题。我想这不是一个真正的解决方案,因为原始数据中的char问题仍然存在。期待在PHP6中为它提供适当的支持!

4 个答案:

答案 0 :(得分:3)

您的网页以UTF-8格式提供,因此我会指向数据库。

在任何SELECT或INSERTS之前确保连接是UTF-8 - 在MySQL中:

SET NAMES "utf8"

答案 1 :(得分:3)

只是关于 CURLOPT_ENCODING 的快速说明:它是 Accept-Encoding 标头,它与字符编码完全不同。支持的接受编码是“identity”,“deflate”和“gzip”。

答案 2 :(得分:2)

与所有调试一样,您首先要解决问题:

我正在使用cURL 来搜索RSS源列表 - 查看提供问题的RSS源中的xml(有多个源,因此某些源可能是正确的,以及错误的错误以不同的方式出错)

然后我正在使用SimpleXML阅读和解析RSS数据。 - 打印出SimpleXML读出的字段 - 它没问题还是出现问题?

然后将排序的数据插入到mySQL数据库中。 - 打印输出问题的数据片段的十六进制(字段),长度(字段)和char_length(字段)。 / p>

修改

获取Feed http://hangout.altsounds.com/external.php?type=RSS2,将其放入验证器http://validator.w3.org/feed/。他们将其内容类型声明为iso-8859-1但是一些实际内容(例如引号)类似于cp1252 - 例如他们使用字节0x93来表示左引号 - {{3} }。

令人恼火的是,这并没有出现在某些工具中 - Firefox似乎猜测正在发生什么并正确显示引号,而且更重要的是,SimpleXML将0x93转换为utf8,因此它出现了0xc293,这加剧了这个问题。

编辑2

使该Feed更准确地读取的解决方法是在传递给Simple XML之前将“ISO-8859-1”替换为“Windows-1252”。它不会100%工作,因为事实证明Feed的某些部分是UTF8。

假设您不能让世界上的每个人都纠正他们的提要,一般方法是将您需要的任何变通方法与发出格式错误的数据的外部系统隔离开来,并传递清晰的utf8到您系统的中心。保存原始外部订阅源的日期副本,以便将来记住为什么需要解决方法,分离并注释实现解决方法的代码行,以便在外部组织更正其订阅源时更容易获取和更改(或以不同方式打破它,并不时再次检查。不幸的是,不是编程到规范,而是编程到当前的bug状态,所以没有永久的,干净的解决方案 - 你能做的最好的事情就是隔离,记录和监控。

答案 3 :(得分:1)

它可能与XML序言有关,对于您链接到的特定Feed,它看起来像这样:

<?xml version="1.0" encoding="ISO-8859-1" ?>

据我所知,SimpleXML所基于的libxml会查找这类内容。我不确定XML文件,但我确信使用HTML字符串可以查找指定字符集的META个元素。

尝试剥离XML序言(我通过剥离HTML META标记解决了类似问题)并且在将数据提供给SimpleXMLElement之前不要忘记utf8_encode()数据。