0

JSON 形式の文字列を latin1 mysql データベースに保存する必要があります。uft8_encode 関数を使用できるようにするには、配列全体を utf8 に変換してから、結果の文字列を latin1 に戻す必要があります。

そこで、次のコードを試しました。

    // $context is equal to array('produção' => 'homologação'), for testing purposes
    $context = Helper::getHelper('Util')->encodeUtf8($context); // Encodes key and value with utf8_encode

    $context = json_encode($context); // {"produ\u00e7\u00e3o":"homologa\u00e7\u00e3o"}

    $context = utf8_decode($context); // Still {"produ\u00e7\u00e3o":"homologa\u00e7\u00e3o"}

しかし、ご覧のとおり、期待どおりには機能しません。Zend_Json ライブラリも使用しようとしましたが、それらの文字でも機能しません。

簡単に言うと、latin1 配列を JSON にエンコードし、その JSON を latin1 データベースに挿入する必要があります。

どうすればそれができるか知っている人はいますか?同じ結果を達成するためのより良い方法も高く評価されます。

4

2 に答える 2

2

utf8_decodeではないものを実行していutf8ます。

JSON でエンコードされたコンテンツは常に ASCII であるため、実行utf8_decodeしても何も起こりません (ASCII は UTF8 のサブセットです)。最初に JSON をデコードする必要があります。

正しい順序は次のとおりです。

$string = "some UTF8 string";   // utf8
$json = json_encode($string); // json
$utf8 = json_decode($json); // utf8
$latin = utf8_decode($utf8); // latin1

もちろん、ここでの JSON の手順は不要ですが、JSON を使用してデータを送信または保存していると思います (これは良い考えです!)。


質問を更新してから:

JSON は ASCII であるため、latin1 でエンコードされたフィールドに格納しても問題ありません。

utf8 でエンコードされたデータを latin1 としてクライアントに送信する場合は、データをデータベースに入れる前または取り出した後に、何らかのエンコード変換を行う必要があります。

私が言いたいのは、JSON をデータベースに保存するために特別な工夫をする必要はないということです。これは質問の一部であってはなりません。この時点で、あなたが何を望んでいるかはまだわかりません。ステートメント:

簡単に言うと、latin1 配列を JSON にエンコードし、その JSON を latin1 データベースに挿入する必要があります。

あなたの入力がUTF8でエンコードされたJSONであるコードサンプルと韻を踏むことはありません。

于 2013-01-28T17:38:32.667 に答える
0

latin1 でエンコードされた配列があります。その配列を JSON にエンコードし、その JSON を latin1 データベースにも格納する必要があります。私の最初の問題は、json_encode が utf8 でエンコードされた配列のみを受け入れることでした。そのため、配列全体を utf8 にエンコードする必要がありました。

しかし、本当の問題は私のデータベースでした。JSON を挿入すると、「\uxxxx」シーケンスを含むリテラル文字列が挿入されます。最初はただの utf8 文字だと思ったので、デコードしてみました。明らかに、私は間違っていました。

json_encodeの結果が純粋なasciiであるという@Fritsの説明は、私を大いに助け、さまざまな方向に目を向けさせ、問題の解決策を見つけました。

「\uxxxx」シーケンスは単なる ascii であったため、これらのシーケンスを適切な utf8 文字に置き換えて、文字列全体をデコードすることが本当に必要でした。

ここでよく説明されています: 「\u00ed」のようなUnicodeエスケープシーケンスを適切なUTF-8エンコード文字にデコードする方法は?

私はその解決策に特に満足していませんが、締め切りがあります。それで、誰かがそれを行うためのより良い方法を持っているなら、私と共有してください.

同じ状況の何人かの人々に役立つことを願っています。その醜さにもかかわらず、それは機能します。

于 2013-01-28T18:19:26.953 に答える