0

データをphpに送信するC#アプリケーションがあり、phpはデータをmysqlデータベースに保存します。そして、私がäöü何か他のものを持っている場合(私はそれをurlencodingしているので&%$/")=!、文字列にも含まれています)、それはデータベースにÈ└/またはそのようなものとして保存されます。したがって、それは明らかにエンコーディングの問題です。どうすれば解決できますか?

編集:
私はこれらのコードを使用しています:
C#:

WebClient.DownloadString(apiString + "sendMessage.php?user=" + user + "&message=" + message);

PHP:

$verbindung = mysql_connect("nightking.org", "username", "password");
mysql_select_db("apidb");
$ergebnis = mysql_query("INSERT INTO `apidb`.`tm_chatdata` (`username` ,`time` ,`message`) VALUES ('" . $_GET['message'] . "',CURRENT_TIMESTAMP , '" . $_GET['user'] . "');");

値を再度呼び出すと、次のようになります。

PHP:

$verbindung = mysql_connect("nightking.org", "username", "password");
mysql_select_db("apidb");
$ergebnis = mysql_query("(SELECT * FROM `tm_chatdata` ORDER BY time DESC LIMIT 38)ORDER BY time ASC;");
$firstOne = true;
while($row = mysql_fetch_object($ergebnis))
{
    if($firstOne)
        $firstOne = false;
    else
    {
        echo "\r\n";
    }
    if($row->username == "system")
    {
        echo "[" . $row->message . "]";
    }
    else
    {
        if($row->username == "command")
        {
            echo "*".$row->message;
        }
        else
        {
            echo /* $row->time . " " . */$row->username . ": " . $row->message;
        }
    }
}

C#:

WebClient.DownloadString(apiString + "getMessages.php");

MySQL の照合タイプが utf8_bin に変更されましたが、まだ機能しません。

4

1 に答える 1

2

アプリケーション内のデータが通過するパスを監査する必要があります。

HttpWebRequestC# ランドから始めて、PHP スクリプトにデータを送信するために使用することになるでしょう。クエリ文字列または HTTP ヘッダー値のみを設定する場合は、何もエンコードする必要はありません。HttpWebRequest がそれを行います。を使用して POSTdata を設定している場合request.GetRequestStream、フォームの送信の種類によって異なりますが、HTML5 ではデフォルトで非 ASCII 文字を数値に変換した UTF-8 にする必要があります。これは有線形式にのみ関係することに注意してください。PHP 環境はこれを自動的に処理します。

PHP には Unicode の組み込みサポートがありません。すべての文字列は 1 バイトの配列と見なすことができます。したがって、文字列が操作されなければ、データはバイト単位で保持されます。操作にはmbstring拡張機能を使用します。

MySQL は、テーブルごとのエンコーディングを許可するため、別の問題を引き起こします。デフォルトは、一貫性のために、またはにlatin1設定することをお勧めします。さらに悪いことに、接続のエンコーディングにも対処する必要がありますutf8utf16

したがって、実際には簡単な答えはありませんが、すべてが一貫していることを確認することをお勧めします。

  • エンコードの方法 (文字のフォーム エンコードと実際の「数値エンコード」の両方) が C# アプリケーションの HTTP クライアントで宣言されていることを確認します。
  • PHP で安全でない方法でマルチバイト文字列を操作していないこと、および C# プログラムによって着信要求の HTTP ヘッダーで宣言されているエンコーディングと一致する方法でそれらを処理していることを確認してください。
  • MySQL テーブルがすべて同じエンコーディングを使用していること、およびそれが適切なエンコーディング (utf8 または utf16 など) であることを確認し、受信データのエンコーディングが異なる場合は、データベースに保存する前にそれに応じて変換します。
于 2013-10-19T10:59:53.143 に答える