如果result变量的值是下面这个时,
"## 暂无标准配置型号,请与SMC联系!\n" + "\n" + "竞争对手型号:"
上面划线部分的代码,返回是true还是false?
先说答案:false。
这个知识点很小,讲明白了也很简单,这次咱们把重点放在排查问题的思路上。
@Test
public void testStrContains() {
String resultMsg = "## 暂无标准配置型号,请与SMC联系!\n" +
"\n" +
"竞争对手型号:";
String checkFlag = "暂无标准配置型号,请与SMC联系!";
assertThat("期望是true", resultMsg.contains(checkFlag));
}
感觉“!”可能是个特殊字符,去掉试试!!
去掉后,就返回true了
可能出现了特殊字符。
这种特殊字符,肉眼不好识别,最好的办法,还是看字符的编码。
话说,计算机上处理的任何字符都要经过编码/解码吧! 从编码的角度分析一下 要实现从 char 到 Byte的相互转换则必须编码 字符是怎么编码的? 编码(Encoding):信息从一种形式或格式转换为另一种形式或格式的过程。 计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题 唐成,公众号:的数字化之路淘宝API返回的空格trim()不掉,好着急好生气
打个断点,来看看“!”的Unicode编码
直接看,都是数字!一下子也搞不清那个数字是哪个字符的编码。
咋办?
可以使用String类的这个API:
/** * Converts this string to a new character array. * * @return a newly allocated character array whose length is the length * of this string and whose contents are initialized to contain * the character sequence represented by this string. */
public char[] toCharArray() {
入参中的“!”编码是 65281
校验标识中的“!”编码是 33
从字符的角度看,“!”【65281】和“!”[33]是两个不同字符,那么在使用contains方法进行比较时,必然不匹配,然后返回false了。
案破了!
当时写代码时,代码中的
"暂无标准配置型号,请与SMC联系!"
是从哪来的,已经不记得了。很可以是手工敲上去的。
因为,后来从日志中copy来的字符串,看也是全角的。
https://gitee.com/baidumap/sse-chat/blob/main/src/test/java/cn/aias/ssechat/global/StringUtilsTest.java