Create string with emoji unicode flag countries

前端 未结 5 2146
北海茫月
北海茫月 2020-12-14 10:41

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

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


        
相关标签:
5条回答
  • 2020-12-14 11:08

    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.

    0 讨论(0)
  • 2020-12-14 11:10

    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.

    0 讨论(0)
  • 2020-12-14 11:18

    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

    0 讨论(0)
  • 2020-12-14 11:18

    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
    
    0 讨论(0)
  • 2020-12-14 11:26

    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.

    0 讨论(0)
提交回复
热议问题