0

今、私自身の意見では、このエンコーディングの問題についてすべてを試し、多くの回答された質問を調べましたが、何もうまくいかなかったので、ここに行きます.

テーブルを持つ MySQL データベースがありUsersます。このテーブルには、照合が設定されている「firstname」のutf8_general_ci列があります (すべての varchar 列はそうです)。次に、スカンジナビアの特殊文字「ø」を使用して、firstname-column が「Løw」に設定されている行を挿入しました。

接続文字列が ";charset=utf8" である php-ActiveRecord ライブラリを使用して行を取得し、その後、次のようにユーザーを json として出力します。

$user = User::find($ID);
$userArr = $user->to_array();
header('Content-Type: application/json; charset=utf-8');
print(json_encode($userArr));

これで有線の作業が始まります。ファーストネームは、MySQL データベースに表示される "Løw" ではなく、"L\u00f8w"になりました。json_encode次に、これが関数なしでも当てはまるかどうかを確認しようとしました。

$user = User::find($ID);
$userArr = $user->to_array();
header('Content-Type: text/plain; charset=utf-8');
print_r($userArr);

しかし、ここでは出力は正しく、ファーストネームは "Løw" でした。次に、配列内のフィールドを にエンコードしようとしました。これは、次のようにutf-8、文字列が機能するかどうかを誰もが教えてくれたからです。utf-8

$return[] = array_map('utf8_encode', $userArr);
print_r(json_encode($return));

しかし、これは私に"L\u00c3\u00b8w"を与えたので、うまくいきませんでした。私はそれをutf8_decodeするアイデアがなかったので、次に試しました:

$return[] = array_map('utf8_decode', $userArr);
print_r(json_encode($return));

しかし、それにより文字列は"null"として返されました。次に、vars がデータベースから出てきたときのエンコーディングを確認しようとしました。次のようにします。

header('Content-Type: text/plain; charset=utf-8');
print(mb_detect_encoding($userArr['firstname']));

しかし、これは戻ってきUTF-8ました。

ご覧のとおり、私はすべてを試しましjson_encodeたが、「ø」文字を「\u00f8」に変更する理由がまだわかりません。助けてください。独自の json_encode-method を作成したくありません。

4

1 に答える 1

1

答えはすぐに見つかりましたが、この件について何も見つけることができなかったので、他のスカンジナビアの人々に知らせることはできませんでした.

json_encode メソッドに以下を追加して問題を解決しました。

print(json_encode($userArr,JSON_UNESCAPED_UNICODE));

これは、メソッドにユニコード文字をエスケープしないように指示するか(私は思う)、またはPHPドキュメントで述べているように:

JSON_UNESCAPED_UNICODE (整数)

マルチバイト Unicode 文字を文字どおりにエンコードします (デフォルトでは、\uXXXX としてエスケープします)。PHP 5.4.0 以降で利用可能です。

于 2013-06-13T13:42:40.330 に答える