php - 无法在 PHP 中解码 UTF8?

标签 php mysql xml utf-8

我每 3/10/60 分钟从在线供稿器获取 XML 供稿。

我使用 SimpleXML 解析提要

最后我将它存储到数据库并从 html 上的数据库中获取。

现在我确定问题不在数据库和 feed 中,因为当我手动尝试时同一个表接受 UTF8 字符

CALL myProc('čćžš')

当我从提要中解析 xml 并将其存储到数据库时,我正在使用相同的过程。

而且提要通常有 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_converticonv,我在谷歌上找到的所有东西我都用过,但没有成功......

我正在使用 PDO,还有 utf8 属性,我也尝试设置名称,甚至是已经在数据库中定义的设置名称。

$this->PDO->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "charset='UTF-8'");

varchar 的每一列都有 utf8 整理。 我几乎可以肯定问题不在数据库内部,因为同一个表接受 čćšž。 所以我请您先想想 PHP 内部可能存在什么问题。

还有

ini_set('default_charset','utf-8');

table 固定装置:

    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;

我不知道该怎么办了......

最佳答案

不要使用 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); 

关于php - 无法在 PHP 中解码 UTF8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31220752/

相关文章:

php - 在 PHP 中重置命名空间?

php - 内部连接的 group by 和 order by 子句的问题

xml - 如何使用 RelaxNG 检查属性是否唯一?

python - Odoo 14 中发票行和日记帐项目之间的差异

xml - XSLT 2.0 将 CSV 转换为 XML 格式

php - Codeigniter - 使用 AJAX 下载 CSV

php - 所有已安装字体的视觉列表以及相应的 pangram 短语?

PHP:为父类设置变量

mysql - 添加一个 FOREIGN KEY 但说该列在它存在时不存在?

c# - 使用 C# 添加 entityFramework 部分