我每隔3/10/60分钟从在线提供商处获取XML Feed。
我使用SimpleXML
解析这些Feed并且我将它存储到数据库并从html上的db获取。
现在我确定问题不在数据库和内部Feed中,因为当我手动尝试时,同一个表接受UTF8字符
CALL myProc('čćžš')
当我从feed解析xml并存储到数据库时,我正在使用相同的过程。
Feed通常有UTF8字符。
所以我认为问题出在php中,当我解析文件时
public function parseFile($path){
$xml = '';
$dec_file = '';
if(!is_null($path)){
$opts = array('http' => array('header' => 'Accept-Charset: UTF-8, *;q=0'));
$context = stream_context_create($opts);
$file = file_get_contents($path,false,$context);
//$file = mb_convert_encoding($file, 'HTML-ENTITIES', "UTF-8");
if(!is_null($file)){
$xml = new SimpleXMLElement($file);
}
else{
echo 'there is no file';
}
}
else{
echo 'Wrong path!';
}
return $xml;
}
$ xml这里不是UTF8。
我试着这样做:
private function toUTF8($data){
$utf8 = utf8_encode($data);
return $utf8;
}
也改为使用utf8_encode: mb_convert 和 iconv ,我在google上找到的所有内容,但都没有成功......
我正在使用PDO,还有属性utf8,我也尝试过设置名称甚至是已在数据库中定义的设置名称。
$this->PDO->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "charset='UTF-8'");
varchar的每个列都有utf8
整理。
我几乎可以肯定问题不在数据库内部,因为同一个表接受čćšž。
所以我请你先思考PHP内部可能存在什么问题。
还有
ini_set('default_charset','utf-8');
表格装置:
CREATE TABLE IF NOT EXISTS `jcjdkdtaur`.`fixtures` (
`Id` INT(32) NOT NULL,
`UpdatedDate` varchar(100) DEFAULT NULL,
`DateTime` datetime NULL DEFAULT NULL,
`Date` date NULL DEFAULT NULL,
`Time` time NULL DEFAULT NULL,
`Status` VARCHAR(40) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL DEFAULT NULL,
`League` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL DEFAULT NULL,
`LeagueID` INT(11) DEFAULT NULL,
`SportID` tinyint DEFAULT 1,
`SportName` varchar(30) DEFAULT 'football',
`Cup` varchar(20) DEFAULT NULL,
`Country` VARCHAR(60) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL DEFAULT NULL,
`EventName` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL DEFAULT NULL,
`HomeTeam` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL DEFAULT NULL,
`HomeTeam_Id` INT(11) NULL DEFAULT NULL,
`AwayTeam` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL DEFAULT NULL,
`AwayTeam_Id` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`Id`,`HomeTeam_Id`,`AwayTeam_Id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
我不知道该怎么做......
答案 0 :(得分:0)
请勿使用utf8_encode,mb_convert或iconv或mb_convert_encoding。
由于
CONVERT(BINARY(CONVERT(CONVERT(BINARY(
CONVERT('Série' USING latin1))
USING utf8) USING latin1)) USING utf8)
--> 'Série'
我的结论是你有“双重编码”。这是可能发生的事情。
SET NAMES latin1
声称客户端有latin1编码;和CHARACTER SET utf8
(好)。这似乎应该处理SET NAMES
$this->PDO->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "charset='UTF-8'");
什么时候完成?在连接之前?后?通常它在连接期间完成:
PDO: $db = new PDO('dblib:host=host;dbname=db;charset=UTF-8', $user, $pwd);