2

キーを持つ配列を参照テーブルとして使用して、文字列を数値に変換しようとしています。

これは配列です:

$q2_10_lt = array("Full-time worker" => 1
                , "Part-time worker" => 2
                , "Unemployed, would like to work" => 3
                , "Unable to work (chronically ill/mentally handicapped/physically handicapped)" => 4
                , "Pensioner/retired" => 5
                , "Housewife/husband" => 6
                , "Student at university of college (post-matric)" => 7
                , "High school learner" => 8
                , "Primary school learner" => 9
                , "Child attending pre-school/nursery school/crèche/day-mother" => 10
                , "Child staying at home" => 11
                , "Other" => 12);

問題のキーは「就学前・保育園・託児所・保育士」です。次のコードを使用する場合、このキーは見つかりません。

$person_tempArr[] = $q2_10_lt[$row["q2_10"]] != null ? $q2_10_lt[$row["q2_10"]] : "12";
$person_tempArr[] = $q2_10_lt[$row["q2_10"]] == null ? $row["q2_10"] : "";

値は、$row["q2_10"]MySQL DB から取得した異なる文字列です。

最初の行から数字の 10 を取得する必要がありますが、代わりに 12 を取得し、文字列全体を変更せずに「子供が就学前/保育園/幼稚園/デイマザー」に通っています。

これは特殊文字èと関係があるに違いありませんが、私はそれを解決できませんでした. 助けてください。

編集1

提案どおりに16進ダンプを実行した後、次の結果が得られました

SQL DB から:

43 68 69 6c 64 20 61 74 74 65 6e 64 69 6e 67 20 70 72 65 2d 73 63 68 6f 6f 6c 2f 6e 75 72 73 65 72 79 20 73 63 68 6f 6f 6c 2f 63 72 e8 63 68 65 2f 64 61 79 2d 6d 6f 74 68 65 72

PHPの文字列から:

43 68 69 6c 64 20 61 74 74 65 6e 64 69 6e 67 20 70 72 65 2d 73 63 68 6f 6f 6c 2f 6e 75 72 73 65 72 79 20 73 63 68 6f 6f 6c 2f 63 72 c3 a8 63 68 65 2f 64 61 79 2d 6d 6f 74 68 65 72

違いは、「E8」と「C3A8」またはDBの「è」とphp文字列の「è」でした。

では、php文字列が「è」のままであることを確認するにはどうすればよいですか?

4

2 に答える 2

3

データベースレイヤーから取得する文字列は、キーとして使用する文字列とは異なります。これを修正するには、毎回同じ文字列を使用します。

ここで同じとは、文字列がバイトごとに同じであることを意味します。データベースから取得した文字列の16進ダンプを実行します。

次に、バイナリ文字列をキーとして入力します(または少なくとも特殊文字の場合)。これにより、PHPファイルを保存しているエンコーディングに関係なく機能するため、コードがより堅牢になります。

編集:データベースと比較するとき、キーはデータベース内のバイナリシーケンスに相互に関連している必要があります。

        , "Child attending pre-school/nursery school/cr\xE8che/day-mother" => 10
                                                       ^^^^

16進表記を使用して、 UTF-8でエンコードされたPHPファイルで「入力」できないバイトを表します。データベースは、ISO-8859-1または同様のエンコーディングを使用しています。

ご覧のとおり\x、それはちょうどその時の16進コードE8です。PHPでは二重引用符で囲まれた文字列で機能します。

于 2012-10-24T13:59:49.277 に答える
0

テーブルの列のエンコーディングを にutf8_general_ci、テーブルの照合順序を に変更することになりましたutf8_general_ci。また、次のコード行を php ファイルに追加しました。

ini_set('default_charset', 'utf-8');

//set encodig to utf-8
mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET CHARACTER SET 'utf8'");

現在は機能していますが、推奨されていないことをしている可能性がありますか?

于 2012-10-25T07:16:23.390 に答える