来自WWW文本的额外字符(与www.text无法比较)

时间:2016-10-05 17:30:32

标签: c# php unity3d

我现在正在Unity上编写一个登录系统,但我有这个奇怪的错误。出于某种原因,当我得到php文件的输出时,C#文件中的if语句看不到'loginreturn'(= AccountDoesntExist)和字符串“AccountDoesntExist”是相同的。我不知道为什么,但也许你聪明的人看到了这个错误,可以帮助我。

C#代码:

IEnumerator TryLogin(string username, string password)
{
    WWWForm form = new WWWForm();

    form.AddField("username", username);
    form.AddField("password", password);

    WWW loginWWW = new WWW(LoginURL, form);
    yield return loginWWW;

    if (!string.IsNullOrEmpty(loginWWW.error))
    {
        Debug.LogError("Cannot connect to LOGIN servers! Error: " + loginWWW.error);
    }else
    {

        string loginreturn = loginWWW.text;
        Debug.Log(loginWWW.text);
        Debug.Log(loginreturn);

        if (loginreturn == "AccountDoesntExist")
            Debug.Log("WORKS!");

    }
}

PHP代码(因为我登录的方式,它总是返回“AccountDoesntExist”):

<?php

$inputusername = $_REQUEST["username"];
$password = $_REQUEST["password"];

$servername = "localhost";
$username = "chatsystem_accs";
$password = "CENCORED";
$dbname = "chatsystem_accs";

//Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

//Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
//Connected successfully

$sql = "SELECT `username`, `password` FROM `accounts`";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        if ($inputusername == $row["username"]) {
            if (password_verify($password, $row["password"])) {
                echo "Success";
            }else {
                echo "UsernameOrPasswordIncorrect";
            }
        }else {
            echo "AccountDoesntExist";
        }
    }
}else {
    echo "AccountDoesntExist";
}

//Close connection
$conn->close();

?>

1 个答案:

答案 0 :(得分:0)

很可能是UTF-8 problem。接收的字节中有一个额外的数据。在比较之前将接收的数据转换为UTF-8。

替换

string loginreturn = loginWWW.text;

string loginreturn  = System.Text.Encoding.UTF8.GetString(loginWWW.bytes, 3, loginWWW.bytes.Length - 3);

修改

像这样调试:

Debug.Log("Received Length: "+ loginreturn.Length);
Debug.Log("Compare Length: " + "AccountDoesntExist".Length);

结果是:

  

收到的长度:19

     

比较长度:18

这是错误的。某处有一个额外的角色。 使用下面的函数再次调试,然后使用displayAsChar(loginreturn);

调用它
void displayAsChar(string badValue)
{
    char[] values = badValue.ToCharArray();
    for (int i = 0; i < values.Length; i++)
    {
        string tempResult = "Value at index " + i + " is: " + values[i];
        Debug.Log(tempResult);
    }
}

它显示角色末尾有一个空字符。我认为那只是“”但事实并非如此。

我做了另一个函数来查看这个空字符是什么:

void showStringAsHex(string badValue)
{
    foreach (char c in badValue)
        Debug.Log("To Unicode: " + ((int)c).ToString("X2"));
}

宾果。最后一个字符是0A(十六进制),也表示为\n。这用作换行。

<强> FIX

在执行比较操作之前,修剪字符串。这将删除角色开头和结尾的任何转义字符和空字符串。

要修剪角色,只需在比较字符串之前添加以下代码。

loginreturn = loginreturn.Trim();

为什么要发布调试过程?

不同服务器的字符可能不同。发布此信息将有助于其他人在将来为自己排除故障并解决此问题。