0

我有一个 C#-Application 将数据发送到 php,而 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

您需要审核应用程序中的数据经过的路径。

从 C# 领域开始,您可能会使用HttpWebRequest将数据发送到您的 PHP 脚本。如果您只设置查询字符串或 HTTP 标头值,那么您不需要对任何内容进行编码:HttpWebRequest 将为您执行此操作。如果您使用 POSTdata 设置,request.GetRequestStream那么它取决于您正在执行哪种表单提交,尽管 HTML5 声明默认情况下这应该是 UTF-8,非 ASCII 字符转换为数值。请注意,这只涉及无线格式,PHP 环境会自动为您处理。

PHP 没有对 Unicode 的内置支持:所有字符串都可以被视为单字节数组,因此只要不对其进行操作,它们就会按字节保存数据。对于操作,请使用mbstring扩展名。

MySQL 提出了另一个问题,因为它允许按表编码。默认值是latin1虽然我建议将其设置为utf8utf16为了一致性。更糟糕的是:您也必须应对连接编码

所以真的没有任何简单的答案,但我建议确保一切都是一致的:

  • 确保在 C# 应用程序的 HTTP 客户端中声明了您的编码方法(表单编码和字符的实际“数字编码”)。
  • 确保您没有在 PHP 中以不安全的方式操作多字节字符串,并且您以与 C# 程序传入请求的 HTTP 标头中声明的编码一致的方式处理它们。
  • 确保您的 MySQL 表都使用相同的编码并且它是适当的编码(例如 utf8 或 utf16),并且如果传入数据具有不同的编码,那么您将在将其保存到数据库之前进行相应的转换。
于 2013-10-19T10:59:53.143 回答