在PHP中无法解码UTF8?

时间:2015-07-04 12:42:25

标签: php mysql xml utf-8

我每隔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;

我不知道该怎么做......

1 个答案:

答案 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'

我的结论是你有“双重编码”。这是可能发生的事情。

  • 客户端的字符编码为utf8(好);和
  • 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);