【问题标题】:JUnit string compare fails for emoji表情符号的 JUnit 字符串比较失败
【发布时间】:2018-10-16 12:44:18
【问题描述】:

我的测试失败了

junit.framework.ComparisonFailure: 
Expected :????‍⚕????‍♂️️
Actual   :????‍⚕️????‍♂️

这两个字符串在我看来是一样的!我在这里想念什么?我在想控制台隐藏了一些字符,比如可能是零宽度的连接器?

这是我的代码。我还有其他使用 ????、?????????? 和 ????‍⚕️ 的测试。它只会失败 ??????‍⚕️??????‍♂️

class Emoji {
    static String unicodeStringFromCodePointStrings(String[] codePointStrings) {
        StringBuilder sb = new StringBuilder();
        for (String codePointString : codePointStrings) {
            codePointString = codePointString.replace("U+","");
            int codePoint = Integer.parseInt(codePointString, 16);
            char[] chars = Character.toChars(codePoint);
            sb.append(new String(chars));
        }
        return sb.toString();
    }
}

public class EmojiTest {
    @Test
    public void testMultipleCompoundEmoji() {
        String[] input = "U+1F469 U+200D U+2695 U+FE0F U+1F9D8 U+200D U+2642 U+FE0F".split(" ");
        String output = Emoji.unicodeStringFromCodePointStrings(input);
        assertEquals("????‍⚕????‍♂️️", output);
    }
}

【问题讨论】:

    标签: java unicode junit emoji


    【解决方案1】:

    第一个(预期的)是

    \u1F469\u200D\u2695\u1F9D8\u200D\u2642\uFE0F\uFE0F

    第二个(实际的)是

    \u1F469\u200D\u2695\uFE0F\u1F9D8\u200D\u2642\uFE0F

    如您所见,在预期值中,U+FE0F 两个字符都在末尾。

    它们可能看起来相同,但它们不是相同的 String 值。

    将文本复制/粘贴到 UTF-8 转换器(例如http://www.endmemo.com/unicode/unicodeconverter.php

    【讨论】:

    • 很奇怪,我刚刚擦掉,又打字,现在测试通过了。第二个(实际)是正确的。知道 \uFE0F 如何在字符串文字中移动吗?预期值现在在?‍⚕️之后显示⚕
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2016-07-05
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多