2017-11-11 21 views
0

jsonを使用してデータベースから変数をエコーし​​ます。ただし、■は次のように表示されます。運でUTF-8文字がJSON形式で正しく表示されない

:私はこれを行っているこの問題を解決しようとする試みで

。任意のアイデアを修正する方法。

EDIT:

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"がéのエスケープされていないユニコードであるとあなたを助けません。私は問題があなたのデータベースの文字セット – miknik

答えて

1

まず、テーブルが実際に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); 

これはトリックを行う必要があります次に、このようなデータベースに接続

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; 

:それは次のようになります。

これは私が上記のテーブルの上にPHP7.1に取り組ん

UPDATE:

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

データベースではありません。私はjsonなしで変数をエコーするtest.phpを書くことによってテストしました。 JSONがなければ正しく表示されました。 –

+0

@CharlesTesterデータベースに接続するときに文字セットを設定する必要があります。文字セットを使用しないと、動作しません。私の更新された答えを見てください。 – zstate

0

1)json_encodeJSON_UNESCAPED_UNICODEを使用してください。

2)データストレージ、データアクセス、 が出力され、UTF-8文字セット(UTF-8 all the way through)で入力されていることを確認してください。

+0

がどのようにエンコードされているのかがわかります。私はjsonなしで変数をエコーするtest.phpを書くことによってテストしました。 JSONがなければ正しく表示されました。 –

関連する問題