2017-11-11 219 views
0

我使用json从我的数据库中回显变量。但是显示为■。UTF-8字符无法以JSON格式正确显示

在试图纠正这一点,我已经做到了这一点:

没有运气。任何想法如何解决。

编辑:

if (isset($_GET['term'])){ 
$return_arr = array(); 

try { 
    $conn = new PDO("mysql:host=".DB_SERVER.";port=8889;dbname=".DB_NAME, DB_USER, DB_PASSWORD); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $stmt = $conn->prepare('SELECT School FROM Schools WHERE School LIKE :term'); 
    $stmt->execute(array('term' => '%'.$_GET['term'].'%')); 

    while($row = $stmt->fetch()) { 
     $return_arr[] = $row['School']; 
    } 

} catch(PDOException $e) { 
    echo 'ERROR: ' . $e->getMessage(); 
} 


/* Toss back results as json encoded array. */ 

echo mb_detect_encoding($return_arr, 'auto'); 

} 
+2

你有没有考虑过了'JSON_UNESCAPED_UNICODE'标志?参见http://php.net/manual/en/function.json-encode.php。 –

+0

我尝试过,但结果仍然相同 –

+0

echo mb_detect_encoding('■','auto');返回它已经是UTF-8。 JSON_UNESCAPED_UNICODE不会帮助你,因为“\ xc3 \ xa9”是é的非转义Unicode。我怀疑问题出在你的数据库字符集 – miknik

回答

1

首先,看看你的表是不是编码为utf8。它应该是这个样子:

CREATE TABLE `Schools` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `School` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

然后连接到你的数据库是这样的:

$dsn = 'mysql:dbname=test;host=127.0.0.1;port=3306;charset=utf8'; 
$user = 'root'; 
$password = 'password'; 
$conn = new PDO($dsn, $user, $password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]); 

最后用JSON_UNESCAPED_UNICODE

echo json_encode($row, JSON_UNESCAPED_UNICODE); 

这应该做的伎俩。

UPDATE

这个工作在PHP7.1在我上面提供的表格:

if (isset($_GET['term'])) { 
    $return_arr = array(); 

    try { 
     $conn = new PDO("mysql:host=127.0.0.1;port=8101;dbname=test;charset=utf8", $user, $password); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $stmt = $conn->prepare('SELECT School FROM Schools WHERE School LIKE :term'); 
     $stmt->execute(array('term' => '%'.$_GET['term'].'%')); 

     $return_arr = []; 
     while($row = $stmt->fetch()) { 
      $return_arr[] = $row['School']; 
     } 

    } catch(PDOException $e) { 
     echo 'ERROR: ' . $e->getMessage(); 
    } 


    /* Toss back results as json encoded array. */ 

    echo json_encode($return_arr, JSON_UNESCAPED_UNICODE); 

} 
+0

它不是数据库。我通过编写一个test.php来测试没有json的回显变量。没有JSON,它显示正确。 –

+0

@CharlesTester当你连接到数据库时,你仍然需要设置字符集,没有字符集就无法工作。看到我更新的答案。 – zstate

0

1)json_encode使用JSON_UNESCAPED_UNICODE

2)确保以UTF-8字符集(UTF-8 all the way through)输出和输入数据存储,数据访问, 。

+0

它不是数据库。我通过编写一个test.php来测试没有json的回显变量。没有JSON,它显示正确。 –