web-dev-qa-db-ja.com

JS / PHPスクリプトへのUTF-8サポートの追加

JavaSciptを使用してPHPスクリプト経由でAJAX POSTを介して)スクリプトにデータを送信するページで作業しています。問題は、入力が次の言語の場合、ラテン語ベースではないので、MySQLテーブルに意味不明な文字を格納することになり、ラテン語のアルファベットはうまく機能します。

ページ自体はUTF-8文字をレンダリングできます。ページの読み込み時に提供されたデータ内にある場合は、私が苦労している投稿です。

اختبار

保存します。ブラウザの開発ツールのネットワークPOSTリクエストを参照してください。

投稿は次のJS関数を介して行われます

function createEmptyStack(stackTitle) {
    return $.ajax({
        type:'POST',
        url:'ajax.php',
        data: {
            "do": 'createEmptyStack',
            newTitle: stackTitle
        },
        dataType: "json"
    });
}

これが私のPHPコードです。

header('Content-Type: text/html; charset=utf-8');

$newTitle = trim($_POST['newTitle']);

$db->query("
INSERT INTO t1(project_id, label) 
VALUES (".$_SESSION['project_id'].", '".$newTitle."')");

このようにページのエンコーディングをチェックすると:

mb_detect_encoding($_POST['newTitle'], "auto");

結果が得られます:TF-8

次のヘッダーも試しました:

header("Content-type: application/json; charset=utf-8");

データが送信されるはずのMySQLテーブル照合はtf8_general_ciに設定されています

ユーザーが同じテーブルにデータを入力するフォームを持つ別のページがあり、どの言語でも完全に機能します。同様のデータをdbに正常に挿入できる理由を他のページで確認すると、上記の挿入クエリが次のように表示されます。

mysql_query("SET NAMES utf8");

クエリの上に、データがまだ意味不明に見える同じ行を追加しようとしました。次の代替案も試しました。

 mysql_query("SET CHARACTER SET utf8 ");

そして

mysql_set_charset('utf8', $db);

...しかし、役に立たない。私は踏みにじられました。それを理解するのに助けが必要です。

環境:

PHP 5.6.40(cgi-fcgi)

MySQL 5.6.45


[〜#〜]更新[〜#〜]

さらにテストを実行しました。

私はアラビア語で「これはテストです」という語句を使用しました-هذااختبار

Ajax.phpコードは正しく動作しているようです。 db挿入後、次のようなUTF-8エンコード値が返されます: "\ u0647\u0630\u0627\u0627\u062e\u062a\u0628\u0627\u0631"、エンコーディングは: "UTF-8"に設定されていますが、私のdbテーブルに挿入されたデータは次のように表示されます:هذااختبار

それでは、なぜdbテーブルを別の照合順序に変換しないのですか?いくつかの理由:.5 milのレコードがあり、非常によく似たINSERTを実行する別のページに移動すると、実際に正しく動作します。

私の他のページがデータの挿入時にASCIIエンコーディングを使用していることがわかります。したがって、ASCII ajax.phpに変換しようとするのは自然なことです。問題I空白のデータで終わります私は今とても混乱しています...

ありがとう


修正済みいくつかの手がかりに基づいて、このページのすべての関数をPDOに書き直して、うまくいきました!

11
santa

1年ほど前にMySQL 5.7を実行していたシステムで非常によく似た問題に遭遇しました。 utf8mb4に設定する必要があるときに、データベース設定の一部がutf8に設定されているように思えます。これにより、データベースはマルチバイト文字を適切に処理できます。

注:utf8mb4エンコーディングはバージョン5.5のMySQLに追加されました。

次のクエリを使用して、エンコーディングを変更できます。データベース、テーブル、列の名前、および列のデータ型を状況に合わせて変更してください。

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name DATATYPE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

これの詳細な説明はここにあります。

MySQLバージョン(5.6)でのこのドキュメント

現在、MySQL 8のドキュメント

0
drakin8564

これは私があなたのコードを機能させるために使用したものです:

<?php

$db = mysqli_connect("localhost", "root", "", "demo");
$db->set_charset("utf8");

// Check connection
if ($db === false) {
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

$newTitle = trim($_POST['newTitle']);

$db->query("
        INSERT INTO t1(project_id, label) 
        VALUES ('5', '" . $newTitle . "')");

このタグをHTMLヘッドに追加します。

<meta charset="utf-8">

私はlatin1_binutf8_binでテストしましたが、どちらの場合でも機能しました。

PHPバージョン7.3.9

MySQLi 5.0.12-dev

0
Kalimah