2012-06-18 20 views
10

我做了.PHP RSS生成器,我有一個問題想在這一行從我的數據庫獲取數據:用htmlspecialchars UTF-8返回空字符串

<description><![CDATA[<?=htmlspecialchars(utf8_substr($row['texto'], 0, 100), ENT_QUOTES, 'utf-8') ?>...]]></description> 

一些條目顯示就好了,和其他人不會返回任何文字...任何想法可能是錯誤的?

這是所有代碼:

<?php 

require('php/config.php'); 
require('php/db.php'); 
require('php/utils.php'); 

header("Content-type: application/xml"); 

$db = new TSQL('SELECT * FROM entradas WHERE estado = 1 ORDER BY fecha DESC LIMIT 20'); 
if ($db->executeQuery()) { 

?><?='<?xml version="1.0" encoding="utf-8" ?>' ?> 
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <channel> 
     <title>Tu Secreto</title> 
     <link>http://www.tusecreto.com.ar/</link> 
     <description>TuSecreto/No se lo cuentes a nadie, contaselo a todos</description> 
     <language>es-ar</language> 
     <copyright>TuSecreto (C) 2005-<?php print strftime("%Y", time()); ?></copyright> 
     <lastBuildDate><?=strftime("%a, %d %b %Y %H:%M:%S ", $row['fecha']) ?></lastBuildDate> 
     <atom:link href="http://www.tusecreto.com.ar/rss.php" rel="self" type="application/rss+xml" /> 
     <docs>http://www.tusecreto.com.ar/rss.php</docs> 
     <generator>TuSecreto RSS Generator v1.0</generator> 
     <ttl>10</ttl> 
     <? while ($row = $db->getRow(MYSQL_ASSOC)) { ?> 
     <item> 
      <title><?=($row['sexo'] == MUJER)?'Mujer':'Hombre' ?> | <?=$row['edad'] ?> <?="A\xC3\xB1os" ?></title> 
      <description><![CDATA[<?=htmlspecialchars(utf8_substr($row['texto'], 0, 100), ENT_QUOTES, 'utf-8') ?>...]]></description> 
      <link>http://www.tusecreto.com.ar/<?=$row['id'] ?></link> 
      <guid isPermaLink="true">http://www.tusecreto.com.ar/<?=$row['id'] ?></guid> 
      <pubDate><?=strftime("%a, %d %b %Y %H:%M:%S ", $row['fecha']) ?></pubDate> 
     </item> 
     <?php } ?> 
    </channel> 
</rss> 

這是一個結果,它返回一個空字符串:

UNA VEZ EN EL colectivo(sentada EN EL asiento個人)我dormíÿ寬多多寶我caíen el pasillo re mal! se mataron de la risa todos !! hasta el colectivero! Pasalo y comento con mi Facebook。 E.P.

+0

給出一些導致返回空字符串的示例。 –

+2

如何定義'utf8_substr'? – Gumbo

+0

我已更新所有代碼和一個結果的帖子...也許是因爲重音字符? 「dormí」。西班牙語是...... – Santiago

回答

12

您的代碼使用htmlspecialchars($string, ENT_QUOTES, 'utf-8')。從manpage

引述如果輸入字符串中包含給定的編碼一個空字符串 中的無效編碼單元序列將被返回,除非是 ENT_IGNORE或ENT_SUBSTITUTE標誌被設置。

使用例如作爲快速解決方法,您可以使用htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'utf-8')

如果無效輸入確實是您的問題,當然,您應該瞭解爲什麼utf8_substr($row['texto'], 0, 100)首先不會返回有效的UTF-8字符串。

+0

(1)默認值不是'ENT_QUOTES',而是'ENT_COMPAT'。 (2)關於'ENT_IGNORE'的文檔內容:「默默丟棄無效的代碼單元序列,而不是返回一個空字符串,不鼓勵使用這個標誌,因爲它可能會帶來安全隱患。」 (3)'ENT_SUBSTITURE'只能從PHP 5.4.0開始 – JeromeJ

+0

絕對不要忽略'ENT_IGNORE'這個錯誤,因爲這對每個文檔都有安全影響。 –