【问题标题】:Can't decode UTF8 in PHP?无法在 PHP 中解码 UTF8?
【发布时间】:2015-07-04 12:42:24
【问题描述】:

我每 3/10/60 分钟从在线提要获取 XML 提要。

我使用 SimpleXML 解析提要

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

现在我确定问题不在数据库和提要中,因为当我手动尝试时,同一张表接受 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,我在 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;

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

【问题讨论】:

  • 能否验证数据库本身的数据?它是否包含正确的值?
  • 一切都是正确的,只是 utf8 varchars 不正确:有如下值:巴西:Série D
  • 你用什么mysql客户端?
  • 我是 MySQL 5.5 和 5.5 php。我在 Cloudways 服务器上使用它
  • 服务器上也选择了utf8编码

标签: php mysql xml utf-8


【解决方案1】:

请勿使用 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); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2013-06-17
    • 2016-08-03
    • 2012-08-08
    相关资源
    最近更新 更多