我从可读性中获取xml提要中的数据并将其插入数据库然后输出。 xml Feed的字符集为UTF-8
,我的html页面标题也为UTF-8
。我甚至通过我的文本编辑器将代码保存为UTF-8
,并且我的数据库也设置为utf8_unicode_ci
。我无法弄清楚为什么会这样。
代码:
$xml = simplexml_load_file( "http://readability.com/christopherburton/latest/feed" );
$json = json_encode( $xml );
$array = json_decode( $json,TRUE );
$items = $array['channel']['item'];
$DB = new mysqli('localhost', 'secret', 'secret', 'secret' );
if( $DB->connect_errno ){
print "failed to connect to DB: {$DB->connect_error}";
exit( 1 );
}
$match = "#^(?:[^\?]*\?url=)(https?://)(?:m(?:obile)?\.)?(.*)$#ui";
$replace = '$1$2';
foreach( $items as $item ){
$title = $item['title'];
$url = preg_replace( $match,$replace,$item['link'] );
$title_url[] = array( $title,$url );
$sql_values[] = "('{$DB->real_escape_string( $title )}','{$DB->real_escape_string( $url )}')";
}
$SQL = "INSERT IGNORE INTO `read`(`title`,`url`) VALUES\n ".implode( "\n,",array_reverse( $sql_values ) );
if( $DB->query( $SQL ) ){
} else {
print "failed to INSERT: [{$DB->errno}] {$DB->error}";
}
$DB->set_charset('utf8');
http://f.cl.ly/items/0X2R0s1Q1Q3V461V3W3P/Screen%20Shot%202014-01-17%20at%2012.14.42%20AM.png
答案 0 :(得分:1)
您的问题出在$DB->set_charset('utf8');
您需要告诉数据库您发送的字符集或希望在之前接收数据 。
但是因为你的查询后$DB->set_charset('utf8');
命令对以前的查询没有影响。
如果没有为连接定义字符集,则DMBS使用在配置中设置为默认值的字符集。
对于mysql,这可能是例如latin1
。
因为mysql认为它接收的数据是在例如latin1
并将转换为utf8
,这就是为什么你会看到这些奇怪的符号。
要解决此问题,您只需确保在通过或希望接收$DB->set_charset('utf8');
中的数据的查询之前调用utf8
。
对于您的示例,您可以将其放在if( $DB->connect_errno ){}
之后,因为在该位置已成功建立连接。