比较相同的字符串会返回false

时间:2016-08-11 23:30:16

标签: .net vb.net io

我想编写一个检查我的ip的函数。如果我的IP是22.161.121.238或者检查给了Exception,它会睡眠当前线程并再次开始检查。

这就是代码:

Private Sub CheckIp()
    Dim ip As String
    Dim mine As String = "22.161.121.238"
    Try
        Do

        Using wc As New Net.WebClient

            ip = System.Text.Encoding.UTF8.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php"))
        End Using


        If String.Equals(ip, mine) Then
            MessageBox.Show("2")
            Threading.Thread.Sleep(10000)
            Else
                MessageBox.Show("@" & ip & "@ is not equal to @" & mine & "@")
            End If
        End If

    Loop While ip = "22.161.121.238"


Catch ex As Exception
    Threading.Thread.Sleep(10000)
    CheckIp()

End Try

End Sub

我不知道为什么它没有显示MessageBox中的“2”。即使ipmine相同,也不会启动Show方法。你能告诉我为什么吗?

修改

启动按钮后我得到的是(我添加@以查看字符串的开始位置):

enter image description here

2 个答案:

答案 0 :(得分:3)

简单的答案是你的2个字符串相同。它们可能看起来相同,但您从网络资源返回的字符串包含字符串开头的 不可见 Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF)(我已检查过)

要确认,请检查返回字符串的各个字符的数值,特别是第一个字符。

作为一种解决方法,您可以使用@ henry的答案,该答案使用不同的方式比较字符串,这将忽略u+feff字符。

或者,您可以显式删除它以进行相等性检查:

If String.Equals(ip.Replace(ChrW(&HFEFF), String.Empty), mine) Then

但是,如果您是PHP页面的作者,您可能想要修复它,以便它首先不返回u+feff字符。

答案 1 :(得分:-1)

试试这个函数,原始函数中有一些if / then逻辑是不正确的。

Private Sub CheckIp()
Dim ip As String
Dim mine As String = "22.161.121.238"
Try
    Do

    Using wc As New Net.WebClient

        ip = System.Text.Encoding.UTF8.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php"))
    End Using


    If string.Compare(ip, mine) = 0 Then
        MessageBox.Show("2")
        Threading.Thread.Sleep(10000)
    Else
            MessageBox.Show("@" & ip & "@ is not equal to @" & mine & "@")
    End If


Loop While ip.Contains("22.161.121.238") 


Catch ex As Exception
Threading.Thread.Sleep(10000)
CheckIp()

End Try

End Sub