Create string with emoji unicode flag countries

六眼飞鱼酱① 提交于 2019-11-27 14:08:57

问题


i need to create a String with a country flag unicode emoji..I did this:

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

Expecting one country flag but i havent..How can i get a unicode country flag emoji in String with the unicodes characters?


回答1:


You should be able to do that simply using toChars from java.lang.Character.

This works for me:

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

prints 🇫🇷, which the client can chose to display like a french flag, or in other ways.




回答2:


The problem is, that the "\uXXXX" notation is for 4 hexadecimal digits, forming a 16 bit char.

You have Unicode code points above the 16 bit range, both U+F1EB and U+1F1F7. This will be represented with two chars, a so called surrogate pair.
You can either use the codepoints to create a string:

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

Or use the surrogate pairs, derivable like this:

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

Giving

"\uD83C\uDDEB\uD83C\uDDF7"

Response to the comment: How to Decode

"\uD83C\uDDEB" are two surrogate 16 bit chars representing U+1F1EB and "\uD83C\uDDF7" is the surrogate pair for 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



回答3:


If you want to use emojis often, it could be good to use a library that would handle that unicode stuff for you: emoji-java

You would just add the maven dependency:

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

And call the EmojiManager:

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

The entire list of supported emojis is here.




回答4:


I suppose you want to achieve something like this

Let me give you 2 example of unicodes for country flags:

for ROMANIA ---> \uD83C\uDDF7\uD83C\uDDF4

for AMERICA ---> \uD83C\uDDFA\uD83C\uDDF8

You can get this and other country flags unicodes from this site Emoji Unicodes

Once you enter the site, you will see a table with a lot of emoji. Select the tab with FLAGS from that table (is easy to find it) then will appear all the country flags. You need to select one flag from the list, any flag you want... but only ONE. After that will appear a text code in the message box...that is not important. Important is that you have to look in the right of the site where will appear flag and country name of your selected flag. CLICK on that, and on the page that will open you need to find the TABLE named Emoji Character Encoding Data. Scroll until the last part of table where sais: C/C++/Java Src .. there you will find the correct unicode flag. Attention, always select the unicode that is long like that, some times if you are not carefull you can select a simple unicode, not long like that. So, keep that in mind.

Indications image 1

Indication image 2

In the end i will post a sample code from an Android app of mine that will work on java the same way.

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

Another simple custom example:

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

You can use this variable where you need it. This will show you the flag of Jamaica in front of the text.

This is all, if you did not understand something just ask.




回答5:


Look at Creating Unicode character from its number

Could not get my machine to print the Unicode you have there, but for other values it works.



来源:https://stackoverflow.com/questions/26231263/create-string-with-emoji-unicode-flag-countries

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!