如何比较字形相同但编码不同的两个字

今天在做字符串比较时遇到个很新奇的问题,在此记录一下。

字符串比较最常用的方法就是equals方法,来看一下下面这个比较会返回什么结果呢?

public static void main(String[] args) {
    {
        String s1 = "⽹"; // 12153
        String s2 = "网"; // 32593
        boolean result = s1.equals(s2);
        System.out.println(result);
    }

    {
        String s1 = "⽺"; // 12154
        String s2 = "羊"; // 32650
        boolean result = s1.equals(s2);
        System.out.println(result);
    }
}

你第一眼看到这段代码可能会想 “这作者该不会是个傻子吧?”,😂

但是,两个result结果又确实都是false。

Java的String对象中char字符的编码格式为UTF-16。debug看一下这几个字的UTF-16的值

看看,看着长的一样的字,UTF-16的值却不同,确实不是同一个字符吧

这是什么情况呢?网上搜了一通,大概是什么“兼容表意文字区”与“统一表意文字区”的区别,我对文字编码了解不深,感兴趣的自己去研究吧。

那产品经理看到该说了:“这两个字明明长的一样,你总不能告诉用户说这俩字不是同一个字吧?你用技术手段处理下,让他们做比较时认为是同一个字”

我说:“xxxxxxxxx……没问题”,只不过需要一个方法来将字符串提前处理一下,这个方法是jdk自带的:

这是加上转换的代码

public static void main(String[] args) {
    {
        String s1 = "⽹"; // 12153
        String s2 = "网"; // 32593
        s1 =  Normalizer.normalize(s1,Normalizer.Form.NFC);
        s2 =  Normalizer.normalize(s2,Normalizer.Form.NFC);
        boolean result = s1.equals(s2);
        System.out.println(result);
    }

    {
        String s1 = "⽺"; // 12154
        String s2 = "羊"; // 32650
        s1 =  Normalizer.normalize(s1,Normalizer.Form.NFC);
        s2 =  Normalizer.normalize(s2,Normalizer.Form.NFC);
        boolean result = s1.equals(s2);
        System.out.println(result);
    }
}

debug一下看看转换后的结果

转换了一道后,值一样了,再次使用 equals 就返回 true 了,大功告成。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 字形相同编码不同符主要有: 1. GB2312 和 Big5 编码:这两种编码是在 80 年代初期为中国大陆和台湾地区分别开发的汉编码标准,它们的符集大致相同,但是编码方式不同。由于两种编码的不兼容性,在中国大陆和台湾地区之间常常会出现乱码问题。 2. GBK 和 GB18030 编码:GBK 是在 GB2312 基础上扩展出来的汉编码标准,它扩展了更多的汉和符号。GB18030 是在 GBK 基础上又进一步扩展出来的汉编码标准,它包含了 GB2312、GBK 和其他少数民族文编码。 3. Unicode 和 UTF-8 编码:Unicode 是为了解决不同语言之间的文本交换问题而发明的一种编码方式,它为世界上所有的语言都分配了唯一的编码,从而使得不同语言的文本可以在计算机中正常显示和交换。UTF-8 是 Unicode 的一种实现方式,它是一种变长的编码方式,能够使用一到四个节表示一个 Unicode 符。 4. Shift-JIS 和 EUC-JP 编码:Shift-JIS 和 EUC-JP 是两种日文编码标准,它们的符集大 ### 回答2: 字形相同编码不同符主要有以下几种情况: 1. 同音异形:即具有相同的读音,但是字形不同符。例如,“了”和“耒”,两个的发音都是"le",但是字形上却不同。 2. 简繁体:即对应着相同的汉,但是在简体和繁体中的编码不同。例如,“门”在简体中的编码是"U+95E8",而在繁体中的编码是"U+95DC"。 3. 不同语言中的相同字形:有些符在不同语言中具有相同字形,但是编码不同。例如,“人”在中文的编码是"U+4EBA",而在日文中的编码是"U+4EBA"。 4. 字形表现形式的差异:有时候同一符的字形不同体、排版或书写风格中会有微小的变化,导致其视觉上稍有差异,但编码相同的。这种情况下,虽然字形相同,但编码不同。 需要注意的是,以上的情况主要指的是在Unicode编码标准下的符。在不同编码标准下,可能会有不同符具有相同字形编码不同的情况。 ### 回答3: 字形相同编码不同符有很多。以下是一些常见的例子: 1. 全角和半角符:全角符在Unicode中的编码通常是半角符的两倍,主要用于中文和日文的排版中,例如全角的中文标点符号和英文符。 2. 繁体和简体符:繁体符和简体符在Unicode中的编码不同,主要因为中文在不同地区存在着不同的书写方式和符形态的变化。 3. 同音不同编码:中文中有很多同音,它们的字形可能相同或相似,但在Unicode中的编码不同的,以便于区分和解析。 4. 大写和小写母:大写母和小写母的字形相同,但在编码上有所区别,Unicode中为了方便大小写的转换和处理,将它们编码不同符。 5. 同形异义不同编码:中文中存在一些字形相同,但不同,它们的编码不同的,以避免产生混淆和歧义。例如,"和"既可以表示"和谐"的意思,也可以表示"和服"的意思,它们在Unicode中有不同编码。 总之,字形相同编码不同符在中文中是很常见的,这样的设计可以提高符的识别和处理能力,同时也便于区分不同的语义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值