【问题标题】:Is the char representation of a String distinct and fixed?String 的 char 表示是否不同且固定?
【发布时间】:2014-08-19 09:50:39
【问题描述】:

在 Java 中,是否保证 toCharArray 方法总是为被认为相等的字符串返回相同的表示?

我认为不会。我会争论以下几点:

相等的字符串不一定是由相同的字符创建的。例如:

ö 的 Unicode 代码点是 U+00F6。 Ö 是 U+00D6。它也可以通过将字符 U+0308 “COMBINING DIAERESIS”与“o”或“O”合成来创建。 src

如果一个字符串要返回创建它的字符数组(对于比较相等的字符串可能不同),那么 toCharArray 将返回不同的值。

除此之外,还有 Java 版本的更改,导致 Unicode 层的修复或更改(这应该很明显)。

【问题讨论】:

    标签: java string unicode equals


    【解决方案1】:

    仅仅因为它们看起来相同,并不意味着它们相同。

    String o1 = "\u00F6";
    String o2 = "o\u0308";
    System.out.println(o1 + " equals to " + o2 + " is " + o1.equals(o2));
    System.out.println(o1 + " compareTo " + o2 + " is " + o1.compareTo(o2));
    System.out.println(o1 + " is " + Arrays.toString(o1.toCharArray()));
    System.out.println(o2 + " is " + Arrays.toString(o2.toCharArray()));
    

    打印

    ö 等于 ö 是假的
    ö compareTo ö 是 135
    ö 是 [ö]
    ö 是 [o, ̈]

    ö equals to ö is false
    ö compareTo ö is 135
    ö is [ö]
    ö is [o, ̈]
    

    【讨论】:

    • 我很惊讶 String 不使用 Unicode 比较。
    • @mafu 一个字符串有一个 unicode 字符,另一个有两个。它们可能看起来相同,但实际上并不相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多