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

时间:2014-10-07 08:00:37

标签: java unicode emoji

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

StringBuffer sb = new StringBuffer();
sb.append(StringEscapeUtils.unescapeJava("\\u1F1EB"));    
sb.append(StringEscapeUtils.unescapeJava("\\u1F1F7"));

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

5 个答案:

答案 0 :(得分:20)

问题是,“\ uXXXX”符号表示4个十六进制数字,形成16位char

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

int[] codepoints = {0x1F1EB, 0x1F1F7};
String s = new String(codepoints, 0, codepoints.length);

或使用代理对,可以这样推导出来:

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

给予

"\uD83C\uDDEB\uD83C\uDDF7"

对评论的回复:如何解码

“\ 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

答案 1 :(得分:10)

您应该可以使用toChars中的java.lang.Character来完成此操作。

这对我有用:

    StringBuffer sb = new StringBuffer();
    sb.append(Character.toChars(127467));
    sb.append(Character.toChars(127479));
    System.out.println(sb);

打印,客户can chose to显示为法国国旗or in other ways

答案 2 :(得分:5)

如果你想经常使用emojis,最好使用一个可以为你处理unicode的库:emoji-java

您只需添加maven依赖项:

<dependency>
  <groupId>com.vdurmont</groupId>
  <artifactId>emoji-java</artifactId>
  <version>1.0.0</version>
</dependency>

并调用EmojiManager:

Emoji emoji = EmojiManager.getForAlias("fr");
System.out.println("HEY: " + emoji.getUnicode());

支持的表情符号的完整列表是here

答案 3 :(得分:1)

我想你想实现这样的目标

enter image description here

让我给您举2个国家/地区代码的unicode示例:

对于罗马尼亚---> \ uD83C \ uDDF7 \ uD83C \ uDDF4

对于美国---> \ uD83C \ uDDFA \ uD83C \ uDDF8

您可以从此站点Emoji Unicodes

获得此代码和其他国家/地区的unicode。

进入网站后,您会看到一个包含很多表情符号的表格。从该表中选择带有FLAGS的标签(很容易找到),然后将显示所有国家/地区标志。您需要从列表中选择一个标志,您想要的任何标志...但只能选择一个。之后,将在消息框中显示一个文本代码……这并不重要。重要的是您必须查看站点的右侧,该位置将显示标志和所选标志的国家名称。单击此按钮,然后在打开的页面上找到名为Emoji字符编码数据的表。滚动到表的最后部分,即:C / C ++ / Java Src ..在那里您将找到正确的unicode标志。注意,请始终选择长这样的unicode,有时,如果您不小心,可以选择一个不长这样的简单unicode。所以记住这一点。

指示图片1

enter image description here

指示图片2

enter image description here

最后,我将从我的Android应用程序中发布示例代码,该示例代码将以相同的方式在Java上工作。

ArrayList<String> listLanguages = new ArrayList<>();
    listLanguages.add("\uD83C\uDDFA\uD83C\uDDF8  " + getString(R.string.English));
    listLanguages.add("\uD83C\uDDF7\uD83C\uDDF4  " + getString(R.string.Romanian));

另一个简单的自定义示例:

String flagCountryName = "\uD83C\uDDEF\uD83C\uDDF2 Jamaica";

您可以在需要的地方使用此变量。这将在文本前面显示牙买加的国旗。

这就是全部,如果您不了解某些内容,请问。

答案 4 :(得分:-3)

查看Creating Unicode character from its number

无法让我的机器打印你在那里的Unicode,但是对于其他值,它可以工作。