表情符号

时间:2018-05-06 16:14:07

标签: java unicode junit emoji

我的测试失败显示

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);
    }
}

1 个答案:

答案 0 :(得分:0)

第一个(预期)是

\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