2

ユーザーコンテンツをmysqlデータベースに保存するPHPスクリプトがあります(PHP 5.4、mysql 5.5.31)

私のデータベースのすべての文字列関連のフィールドにはutf8_unicode_ci照合があります。

私の(簡略化された)コードは次のようになります。

$db_handle = mysql_connect('localhost', 'username', 'password');
mysql_select_db('my_db');

mysql_set_charset('utf8', $db_handle);

// ------ INSERT: First example -------
$s   = "je viens de télécharger et installer le logiciel";
$sql = "INSERT INTO my_table (post_id, post_subject, post_text) VALUES (1, 'subject 1', '$s')";
mysql_query($sql, $db_handle);

// ------ INSERT: Second example -------
$s   = "EPrints and العربية";
$sql = "INSERT INTO my_table (post_id, post_subject, post_text) VALUES (2, 'subject 2', '$s')";
mysql_query($sql, $db_handle);
// ------------- 

mysql_close($db_handle);

é問題は、次の行をコメントしない限り、最初の挿入 (アクセント付きのラテン テキスト) が失敗することです。

mysql_set_charset('utf8', $db_handle);

しかし、2 番目のクエリ (ラテン語とアラビア語のコンテンツの混合) は、私が呼び出さない限り失敗しますmysql_set_charset('utf8', $db_handle);

私はこれに2日間苦労しています。UTF8 はフランス語のアクセントのような文字をサポートしていると思っていましたが、明らかにサポートしていません!

どうすればこれを修正できますか?

4

3 に答える 3

3

mysql_set_charset('utf8', $db_handle)送信するデータが UTF-8 でエンコードされることをデータベースに伝えます。結果がめちゃくちゃな場合は、実際には UTF-8 でエンコードされたテキストを送信していないことを意味します。送信するもののエンコーディングを再確認してください。

UTF8 はフランス語のアクセントのような文字をサポートしていると思っていましたが、明らかにサポートしていません!

私は大丈夫です。


テキストを操作し、Web アプリで Unicode を前後に処理するためのエンコーディングと文字セットについて、すべてのプログラマーが絶対に、積極的に知っておく必要があることをご覧ください。

于 2013-07-03T08:11:17.560 に答える
2

PHP テキストは UTF-8 ですか? これは、エディタのエンコーディングに関するものです。はいの場合、文字列リテラルのバイトはすでに問題ないはずです。アラビア語も書かれているのでそうらしいです。

SQL には準備済みステートメントを使用します。これにはいくつかの利点があります。セキュリティ (SQL インジェクション)、引用符やその他の特殊文字のエスケープ、そして ... おそらく ... SQL 文字列のエンコーディングです。

可能性は低い: 試してみる

$s   = utf8_encode("je viens de télécharger et installer le logiciel");

別の問題を予見できますが、utf8_encode の定義は ISO-8859-1 文字列を想定しています。これは、フランス語には適していますが、アラビア語には適していません。これが機能する場合、PHP のエンコーディングが何らかの形で間違っています。

(Java は Unicode に対してより一貫性があることがわかったので、PHP については完全にはわかりません。)

于 2013-07-03T08:24:31.643 に答える
1

エンコーディングを知り、必要に応じて変換するという問題は、このようなものを使用して対処できます。これにより、コーディングが CP1252 であることを確認できます。これを逆にして、UTF8 であることを確認します。

function conv_text($value) {
    $result = mb_detect_encoding($value." ","UTF-8,CP1252") == "UTF-8" ? iconv("UTF-8", "CP1252", $value ) : $value;
    return $result;
}
于 2016-02-26T16:13:29.160 に答える