java打印出来是同一个词,可equals却不等

图片描述

这个什么问题,命名都是 商品
为什么后面是false

阅读 3.9k
5 个回答

你的两个字符串其实分别是下面的a b数组,因为控制台都是utf-8编码输出的,所以看起来是一样的

char[] a = new char[3];
a[0] = '\uFEFF';
a[1] = '商';
a[2] = '品';
System.out.println(String.valueOf(a));
char[] b = new char[2];
b[0] = '商';
b[1] = '品';
System.out.println(String.valueOf(b));

可能是有空格之类的不可见字符。

2个可能性

1.数据源中有不可见字符如 \r,\n,\t
2.当前的equals方法被重写了
static void printUTF8Bytes(String s) {
    try {
        byte[] b = s.getBytes("utf-8");
        for(byte c : b) {
            System.out.print(Integer.toHexString(c&0xff));
        }
        System.out.println();
    } catch (java.io.UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

用这个printUTF8Bytes方法把hd和title的UTF-8编码输出来看一下。

我以前遇到过一次,我把一个txt文件的内容读出来去代码里比较,本来很简单的,但是最后里面所有行的内容都匹配上了。。。除了第一行。。。最后debug看。。。结果第一行的开头被莫名塞了一个\uFEFF

文件里的内容

clipboard.png

代码里读出来,看来很正常

clipboard.png

但其实。。。打开第一行的字符串的char数组,被塞了一个元素\uFEFF

clipboard.png

所以一直匹配不起,我试了,就算我第一行给个换行,也要硬赛个\uFEFF

clipboard.png

debug看

clipboard.png

所以最后为了达到目的,我把首行舍弃,读取时从第二行开始,首行空格或者随便写啥都行,解决了当时的问题

后面百度了哈,貌似是windows自带的记事本编辑工具在保存UTF-8的文件时,会在每个文件开头添加0xefbbbf(十六进制)的字符(描述具体查看javaweb项目部署到tomcat下,修改配置文件问题总结

thx,仅供参考

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题