string.Equal()的问题明明两个一样的字符串却不相等

时间:2022-06-16 14:01:26
先贴出问题:
首先是我写的一个函数,判断传来的字符串a是否等于"马",问题是a的值明明是“马”却不相等.
 void judgeProperty(string a)
    {
        if (a.Equals("马"))
            Debug.Log("11111");
     }
这是调试的结果:
string.Equal()的问题明明两个一样的字符串却不相等
可以看到a的值的确是“马”,却没有执行if里的语句输出“11111”。
接着我怀疑a是否有空字符串,但我试了a.Trim()后已久返回false。
我接着开始怀疑是不是在对a赋值时的问题,贴上代码:
我是通过读取字节流,然后通过 Encoding.UTF8.GetString(buffer)转换成字符串,然后才通过 OnWords(currentString)函数把字符串传过来的。
               int msgSize;
                lock (reciveStream)
                {
                    msgSize = reciveStream.Read(buffer, 0, bufferSize);
                }
                if (msgSize != 0)
                {
                    string str = Encoding.UTF8.GetString(buffer);
                    currentString = string.Empty;
                    currentString = str;
                    //print(currentString);
                    OnWords(currentString);
                }
奇怪的是 如果我直接定义一个 private string ddd = "马";这时a.Equals("马")是返回true的。
我这个问题该如何解决才能让本来就是“马”的字符串变量a在a.Equal("马")中返回true?

18 个解决方案

#1


文件 - > 高级保存选项 -> 看看是不是utf-8 带签名

#2


调试器的局部变量窗口,目前不显示\0等字符,即"马\0\0\0"会显示单个"马"字。

lock (reciveStream)
{
    msgSize = reciveStream.Read(buffer, 0, bufferSize);   // msgSize很可能比buffer.Length小
}
if (msgSize != 0)
{
    string str = Encoding.UTF8.GetString(buffer,  0, msgSize);
    ...

#3


 string str = Encoding.UTF8.GetString(buffer, 0, msgSize);这个我试了,还是不行。

#4


string.Equal()的问题明明两个一样的字符串却不相等
是带签名的,是这个的问题么?

#5


引用 1 楼 akuma8848 的回复:
文件 - > 高级保存选项 -> 看看是不是utf-8 带签名

是带签名的,是这个的问题么?这个要怎么修改?

#6


string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。

#7


引用 6 楼 crystal_lz 的回复:
string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。

buffer的大小我定义的1024位:
private const int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?

#8


引用 7 楼 LI5852258 的回复:
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?


调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3

如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。

#9


引用 8 楼 Forty2 的回复:
Quote: 引用 7 楼 LI5852258 的回复:

但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?


调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3

如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。

谢谢,貌似找到原因了,等我调试一下 告诉你

#10


引用 7 楼 LI5852258 的回复:
Quote: 引用 6 楼 crystal_lz 的回复:

string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。

buffer的大小我定义的1024位:
private const int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?

string.Equal()的问题明明两个一样的字符串却不相等
所以说 你确定没有问题?。。。

#11


string.Equal()的问题明明两个一样的字符串却不相等
妈蛋 刚才截图错了。。

#12


Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档

#13


引用 11 楼 crystal_lz 的回复:
string.Equal()的问题明明两个一样的字符串却不相等
妈蛋 刚才截图错了。。

谢谢老司机。的确是“\0”的问题,我调试msgSize的length是1022.单独一个“马”的length是1;
我在这里处理了一下,能够输出“1111”了,没问题了。
void judgeProperty(string a)
    {
         string aa = Regex.Replace(a, @"[\0]", "");
        Debug.Log(aa.Length);
        if (aa.Equals("马"))
            Debug.Log("11111");
 但是我考虑为什么这里
lock (reciveStream)
                {
                        msgSize = reciveStream.Read(buffer, 0, bufferSize);
                }
msgSize的大小是1022呢?
然后我在这里打断点进行调试发现了一个问题:
string.Equal()的问题明明两个一样的字符串却不相等
这句话在unity线程里调用会出现如下错误:
ToString can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.

#14


引用 9 楼 LI5852258 的回复:
Quote: 引用 8 楼 Forty2 的回复:

Quote: 引用 7 楼 LI5852258 的回复:

但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?


调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3

如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。

谢谢,貌似找到原因了,等我调试一下 告诉你

length的确不相等。见下文

#15


引用 12 楼 shingoscar 的回复:
Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档

谢谢教诲!粗心了。

#16


移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?

#17


引用 16 楼 crystal_lz 的回复:
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?

我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?

#18


引用 17 楼 LI5852258 的回复:
Quote: 引用 16 楼 crystal_lz 的回复:

移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?

我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?

那就是你发送那边就有问题了 一个马字 你发过来1024字节? 这不是搞笑吗。。对方是有一个1024的缓存区域吧 每次发送把缓存区全部发送过来了吧
通常情况下.Read()返回的是从流中读取到的实际大小数据 假设你的缓存是1024 我发送了 5个字节过来 那么正常情况msgSize是5 当然也有可能是 小于5的一个数 比如3 那么再次调用他可能就是2 了 也就是你的数据在传送过程中可能被拆成了几分 也有可能你那边连续发送两个5字节 的数据过来 你这边读取出来的msgSize可能会出现10的情况 这是粘包的情况 但是 数据总和应该是不会有问题的 如果对发发送了一个大于1024的 那么 你这边的缓存接收不完 那么就可能需要多次接收 反正 数据总和应该是不会有问题的 对发发送了多收 你就收到多少

#1


文件 - > 高级保存选项 -> 看看是不是utf-8 带签名

#2


调试器的局部变量窗口,目前不显示\0等字符,即"马\0\0\0"会显示单个"马"字。

lock (reciveStream)
{
    msgSize = reciveStream.Read(buffer, 0, bufferSize);   // msgSize很可能比buffer.Length小
}
if (msgSize != 0)
{
    string str = Encoding.UTF8.GetString(buffer,  0, msgSize);
    ...

#3


 string str = Encoding.UTF8.GetString(buffer, 0, msgSize);这个我试了,还是不行。

#4


string.Equal()的问题明明两个一样的字符串却不相等
是带签名的,是这个的问题么?

#5


引用 1 楼 akuma8848 的回复:
文件 - > 高级保存选项 -> 看看是不是utf-8 带签名

是带签名的,是这个的问题么?这个要怎么修改?

#6


string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。

#7


引用 6 楼 crystal_lz 的回复:
string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。

buffer的大小我定义的1024位:
private const int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?

#8


引用 7 楼 LI5852258 的回复:
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?


调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3

如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。

#9


引用 8 楼 Forty2 的回复:
Quote: 引用 7 楼 LI5852258 的回复:

但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?


调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3

如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。

谢谢,貌似找到原因了,等我调试一下 告诉你

#10


引用 7 楼 LI5852258 的回复:
Quote: 引用 6 楼 crystal_lz 的回复:

string str = Encoding.UTF8.GetString(buffer);
你确定这样不会有问题? 你确定 你的buffer 只有一个 马字的大小?。。

buffer的大小我定义的1024位:
private const int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?

string.Equal()的问题明明两个一样的字符串却不相等
所以说 你确定没有问题?。。。

#11


string.Equal()的问题明明两个一样的字符串却不相等
妈蛋 刚才截图错了。。

#12


Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档

#13


引用 11 楼 crystal_lz 的回复:
string.Equal()的问题明明两个一样的字符串却不相等
妈蛋 刚才截图错了。。

谢谢老司机。的确是“\0”的问题,我调试msgSize的length是1022.单独一个“马”的length是1;
我在这里处理了一下,能够输出“1111”了,没问题了。
void judgeProperty(string a)
    {
         string aa = Regex.Replace(a, @"[\0]", "");
        Debug.Log(aa.Length);
        if (aa.Equals("马"))
            Debug.Log("11111");
 但是我考虑为什么这里
lock (reciveStream)
                {
                        msgSize = reciveStream.Read(buffer, 0, bufferSize);
                }
msgSize的大小是1022呢?
然后我在这里打断点进行调试发现了一个问题:
string.Equal()的问题明明两个一样的字符串却不相等
这句话在unity线程里调用会出现如下错误:
ToString can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.

#14


引用 9 楼 LI5852258 的回复:
Quote: 引用 8 楼 Forty2 的回复:

Quote: 引用 7 楼 LI5852258 的回复:

但我用了string str = Encoding.UTF8.GetString(buffer,0,msgSize);这句。这样有问题么?


调试。
比如检查 str.Length是否等于1
比如检查 msgSize是否等于3

如果不是,可能是发送方出错;也可能是你接收(以及断句)的方法有误。

谢谢,貌似找到原因了,等我调试一下 告诉你

length的确不相等。见下文

#15


引用 12 楼 shingoscar 的回复:
Trim默认移除的是Whitespace
\0不是Whitespace
好好看文档

谢谢教诲!粗心了。

#16


移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?

#17


引用 16 楼 crystal_lz 的回复:
移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?

我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?

#18


引用 17 楼 LI5852258 的回复:
Quote: 引用 16 楼 crystal_lz 的回复:

移除 \0 根本不是正确的做法 你当你的那个msgSize 是拿来打酱油的? 别人都给你返回真实数据长度了 你却直接转换整个buffer
Encoding.xxx.GetBytes(byte[],index,length)你当这个重载是打酱油的?

我看了服务器端,每一次传来的字节流长度是固定的1024。问题是这个函数:
msgSize = reciveStream.Read(buffer, 0, bufferSize);返回的长度到底是什么长度?
是接收的字节流长度还是读到的数据的长度?

那就是你发送那边就有问题了 一个马字 你发过来1024字节? 这不是搞笑吗。。对方是有一个1024的缓存区域吧 每次发送把缓存区全部发送过来了吧
通常情况下.Read()返回的是从流中读取到的实际大小数据 假设你的缓存是1024 我发送了 5个字节过来 那么正常情况msgSize是5 当然也有可能是 小于5的一个数 比如3 那么再次调用他可能就是2 了 也就是你的数据在传送过程中可能被拆成了几分 也有可能你那边连续发送两个5字节 的数据过来 你这边读取出来的msgSize可能会出现10的情况 这是粘包的情况 但是 数据总和应该是不会有问题的 如果对发发送了一个大于1024的 那么 你这边的缓存接收不完 那么就可能需要多次接收 反正 数据总和应该是不会有问题的 对发发送了多收 你就收到多少