使用表情符号unicode标志国家创建字符串

col*_*ore 12 java unicode emoji

我需要创建一个带有国家标志unicode表情符号的字符串..我这样做了:

StringBuffer sb = new StringBuffer();
sb.append(StringEscapeUtils.unescapeJava("\\u1F1EB"));    
sb.append(StringEscapeUtils.unescapeJava("\\u1F1F7"));
Run Code Online (Sandbox Code Playgroud)

期待一个国家的国旗,但我没有..如何在字符串中使用unicodes字符获得一个unicode country flag表情符号?

Joo*_*gen 22

问题是,"\ uXXXX"表示法是4个十六进制数字,形成一个16位char.

您有超过 16位范围的Unicode代码点,U + F1EB和U + 1F1F7.这将用两个字符表示,即所谓的代理对.
您可以使用代码点来创建字符串:

int[] codepoints = {0x1F1EB, 0x1F1F7};
String s = new String(codepoints, 0, codepoints.length);
Run Code Online (Sandbox Code Playgroud)

或者使用代理对,可以这样派生:

System.out.print("\"");
for (char ch : s.toCharArray()) {
    System.out.printf("\\u%04X", (int)ch);
}
System.out.println("\"");
Run Code Online (Sandbox Code Playgroud)

给予

"\uD83C\uDDEB\uD83C\uDDF7"
Run Code Online (Sandbox Code Playgroud)

对评论的回复:如何解码

"\ uD83C\uDDEB"是代表U + 1F1EB的两个代理16位字符,而"\ uD83C\uDDF7"是U + 1F1F7的代理对.

private static final int CP_REGIONAL_INDICATOR = 0x1F1E7; // A-Z flag codes.

/**
 * Get the flag codes of two (or one) regional indicator symbols.
 * @param s string starting with 1 or 2 regional indicator symbols.
 * @return one or two ASCII letters for the flag, or null.
 */
public static String regionalIndicator(String s) {
    int cp0 = regionalIndicatorCodePoint(s);
    if (cp0 == -1) {
        return null;
    }
    StringBuilder sb = new StringBuilder();
    sb.append((char)(cp0 - CP_REGIONAL_INDICATOR + 'A'));
    int n0 = Character.charCount(cp0);
    int cp1 = regionalIndicatorCodePoint(s.substring(n0));
    if (cp1 != -1) {
        sb.append((char)(cp1 - CP_REGIONAL_INDICATOR + 'A'));
    }
    return sb.toString();
}

private static int regionalIndicatorCodePoint(String s) {
    if (s.isEmpty()) {
        return -1;
    }
    int cp0 = s.codePointAt(0);
    return CP_REGIONAL_INDICATOR > cp0 || cp0 >= CP_REGIONAL_INDICATOR + 26 ? -1 : cp0;
}

System.out.println("Flag: " + regionalIndicator("\uD83C\uDDEB\uD83C\uDDF7"));
Flag: EQ
Run Code Online (Sandbox Code Playgroud)


leo*_*leo 10

你应该能够简单地使用toCharsfrom 来做到这一点java.lang.Character.

这对我有用:

    StringBuffer sb = new StringBuffer();
    sb.append(Character.toChars(127467));
    sb.append(Character.toChars(127479));
    System.out.println(sb);
Run Code Online (Sandbox Code Playgroud)

打印,客户可以选择显示像法国国旗,或以其他方式.


Vin*_*ont 5

如果您想经常使用表情符号,最好使用一个可以为您处理unicode内容的库:emoji-java

您只需添加Maven依赖项:

<dependency>
  <groupId>com.vdurmont</groupId>
  <artifactId>emoji-java</artifactId>
  <version>1.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

并调用EmojiManager:

Emoji emoji = EmojiManager.getForAlias("fr");
System.out.println("HEY: " + emoji.getUnicode());
Run Code Online (Sandbox Code Playgroud)

支持的表情符号的完整列表在这里