Das Problem ist, dass die "\ uXXXX" Notation für 4 Hexadezimalziffern ist, die ein 16 Bit char
bilden.
Sie haben Unicode-Codepunkte oben die 16-Bit-Bereich, die beide U + F1EB und U + 1F1F7. Dies wird mit zwei Zeichen dargestellt, einem sogenannten Ersatzpaar.
Sie entweder die Codepoints verwenden, um eine Zeichenfolge zu erstellen:
int[] codepoints = {0x1F1EB, 0x1F1F7};
String s = new String(codepoints, 0, codepoints.length);
Oder die Ersatzpaare verwenden, wie dies ableitbar:
System.out.print("\"");
for (char ch : s.toCharArray()) {
System.out.printf("\\u%04X", (int)ch);
}
System.out.println("\"");
Geben
"\uD83C\uDDEB\uD83C\uDDF7"
Antwort auf den Kommentar: How to Dekodieren
"\ uD83C \ uDDEB" sind zwei 16-Bit-Surrogat-Zeichen darstellt U + 1F1EB und "\ uD83C \ uDDF7" ist das Ersatzpaar für 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
Was hast du bekommen, wenn nicht? – leo
Was machst du mit der Schnur danach? Und welche Idee haben die 'StringEscapeUtils.unescapeJava' Aufrufe? – weston
Ich bekomme E97A – colymore