it-swarm.com.de

Erstellen eines Unicode-Zeichens aus seiner Nummer

Ich möchte ein Unicode-Zeichen in Java anzeigen. Wenn ich das mache, funktioniert es einwandfrei:

String symbol = "\u2202";

symbol ist gleich "∂". Das ist, was ich will.

Das Problem ist, dass ich die Unicode-Nummer kenne und daraus das Unicode-Symbol erstellen muss. Ich habe (für mich) das Offensichtliche versucht:

int c = 2202;
String symbol =  "\\u" + c;

In diesem Fall ist das Symbol jedoch gleich "\ u2202". Das ist nicht was ich will.

Wie kann ich das Symbol konstruieren, wenn ich seine Unicode-Nummer kenne (aber nur zur Laufzeit - ich kann es nicht wie im ersten Beispiel hart codieren)?

102
Paul Reiners

Wirf einfach dein int in ein char. Sie können das mit Character.toString() in ein String konvertieren:

String s = Character.toString((char)c);

BEARBEITEN:

Denken Sie daran, dass die Escape-Sequenzen im Java Quellcode (der \u bits) sind in HEX, wenn Sie also versuchen, eine Escape-Sequenz zu reproduzieren, benötigen Sie etwas wie int c = 0x2202.

66
dty

Wenn Sie eine UTF-16-codierte Codeeinheit als char erhalten möchten, können Sie die Ganzzahl analysieren und in diese umwandeln, wie andere vorgeschlagen haben.

Wenn Sie alle Codepunkte unterstützen möchten, verwenden Sie Character.toChars(int) . Dies behandelt Fälle, in denen Codepunkte nicht in einen einzelnen char Wert passen.

Doc sagt:

Konvertiert das angegebene Zeichen (Unicode-Codepunkt) in seine in einem Zeichen-Array gespeicherte UTF-16-Darstellung. Wenn der angegebene Codepunkt ein Wert für BMP (Basic Multilingual Plane oder Plane 0) ist, hat das resultierende Zeichenarray den gleichen Wert wie codePoint Das resultierende char-Array hat das entsprechende Ersatzpaar.

121
McDowell

Die anderen Antworten hier unterstützen entweder nur Unicode bis zu U + FFFF (die Antworten, die sich auf nur eine Instanz von char beziehen) oder sagen nicht, wie man zum eigentlichen Symbol kommt (die Antworten enden bei Character.toChars () oder verwenden eine falsche Methode danach), also füge meine Antwort auch hier hinzu.

Um auch zusätzliche Codepunkte zu unterstützen, muss Folgendes ausgeführt werden:

// this character:
// http://www.isthisthingon.org/unicode/index.php?page=1F&subpage=4&glyph=1F495
// using code points here, not U+n notation
// for equivalence with U+n, below would be 0xnnnn
int codePoint = 128149;
// converting to char[] pair
char[] charPair = Character.toChars(codePoint);
// and to String, containing the character we want
String symbol = new String(charPair);

// we now have str with the desired character as the first item
// confirm that we indeed have character with code point 128149
System.out.println("First code point: " + symbol.codePointAt(0));

Ich habe auch einen kurzen Test gemacht, welche Konvertierungsmethoden funktionieren und welche nicht

int codePoint = 128149;
char[] charPair = Character.toChars(codePoint);

String str = new String(charPair, 0, 2);
System.out.println("First code point: " + str.codePointAt(0));    // 128149, worked
String str2 = charPair.toString();
System.out.println("Second code point: " + str2.codePointAt(0));  // 91, didn't work
String str3 = new String(charPair);
System.out.println("Third code point: " + str3.codePointAt(0));   // 128149, worked
String str4 = String.valueOf(code);
System.out.println("Fourth code point: " + str4.codePointAt(0));  // 49, didn't work
String str5 = new String(new int[] {codePoint}, 0, 1);
System.out.println("Fifth code point: " + str5.codePointAt(0));   // 128149, worked
19
eis

Dieser funktionierte gut für mich.

  String cc2 = "2202";
  String text2 = String.valueOf(Character.toChars(Integer.parseInt(cc2, 16)));

Jetzt wird text2 ∂ haben.

5
MeraNaamJoker

Denken Sie daran, dass char ein ganzzahliger Typ ist und daher einen ganzzahligen Wert sowie eine Zeichenkonstante erhalten kann.

char c = 0x2202;//aka 8706 in decimal. \u codepoints are in hex.
String s = String.valueOf(c);
5
ILMTitan
String st="2202";
int cp=Integer.parseInt(st,16);// it convert st into hex number.
char c[]=Character.toChars(cp);
System.out.println(c);// its display the character corresponding to '\u2202'.
4

Obwohl dies eine alte Frage ist, gibt es eine sehr einfache Möglichkeit, dies in Java 11, das heute veröffentlicht wurde) zu tun: Sie können eine neue Überladung von Character verwenden .toString () :

public static String toString​(int codePoint)

Returns a String object representing the specified character (Unicode code point). The result is a string of length 1 or 2, consisting solely of the specified codePoint.

Parameters:
codePoint - the codePoint to be converted

Returns:
the string representation of the specified codePoint

Throws:
IllegalArgumentException - if the specified codePoint is not a valid Unicode code point.

Since:
11

Da diese Methode alle Unicode-Codepunkte unterstützt, muss die Länge der zurückgegebenen Zeichenfolge nicht unbedingt 1 sein.

Der Code, der für das in der Frage angegebene Beispiel benötigt wird, lautet einfach:

    int codePoint = '\u2202';
    String s = Character.toString(codePoint); // <<< Requires JDK 11 !!!
    System.out.println(s); // Prints ∂

Dieser Ansatz bietet mehrere Vorteile:

  • Es funktioniert für jeden Unicode-Codepunkt und nicht nur für diejenigen, die mit einem char behandelt werden können.
  • Es ist kurz und leicht zu verstehen, was der Code tut.
  • Es gibt den Wert als Zeichenfolge und nicht als char[] Zurück, was häufig gewünscht wird. Die Antwort von McDowell ist angemessen, wenn der Codepunkt als char[] Zurückgegeben werden soll.
2
skomisa

Das ist wie man es macht:

int cc = 0x2202;
char ccc = (char) Integer.parseInt(String.valueOf(cc), 16);
final String text = String.valueOf(ccc);

Diese Lösung ist von Arne Vajhøj.

2
Paul Reiners

Der folgende Code schreibt die 4 Unicode-Zeichen (durch Dezimalstellen dargestellt) für das Wort "be" auf Japanisch. Ja, das japanische Verb "be" hat 4 Zeichen! Der Wert von Zeichen ist dezimal und wurde in ein Array von String [] eingelesen - beispielsweise mit split. Wenn Sie Octal oder Hex haben, parseInt nehmen Sie auch einen Radix.

// pseudo code
// 1. init the String[] containing the 4 unicodes in decima :: intsInStrs 
// 2. allocate the proper number of character pairs :: c2s
// 3. Using Integer.parseInt (... with radix or not) get the right int value
// 4. place it in the correct location of in the array of character pairs
// 5. convert c2s[] to String
// 6. print 

String[] intsInStrs = {"12354", "12426", "12414", "12377"}; // 1.
char [] c2s = new char [intsInStrs.length * 2];  // 2.  two chars per unicode

int ii = 0;
for (String intString : intsInStrs) {
    // 3. NB ii*2 because the 16 bit value of Unicode is written in 2 chars
    Character.toChars(Integer.parseInt(intsInStrs[ii]), c2s, ii * 2 ); // 3 + 4
    ++ii; // advance to the next char
}

String symbols = new String(c2s);  // 5.
System.out.println("\nLooooonger code point: " + symbols); // 6.
// I tested it in Eclipse and Java 7 and it works.  Enjoy
1
user96265

Hier ist ein Block zum Ausdrucken von Unicode-Zeichen zwischen \u00c0 bis \u00ff:

char[] ca = {'\u00c0'};
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 16; j++) {
        String sc = new String(ca);
        System.out.print(sc + " ");
        ca[0]++;
    }
    System.out.println();
}
1
fjiang_ca

Leider führt das Entfernen eines Rückschlags, wie im ersten Kommentar (newbiedoodle) erwähnt, nicht zu einem guten Ergebnis. Die meisten (wenn nicht alle) IDE gibt einen Syntaxfehler aus. Der Grund dafür liegt darin, dass Java Escaped Unicode-Format die Syntax "\ uXXXX" erwartet, wobei XXXX ist 4 hexadezimale Ziffern, die obligatorisch sind. Versuche, diese Zeichenfolge aus Teilen zu falten, schlagen fehl. Natürlich ist "\ u" nicht dasselbe wie "\ u". Die erste Syntax bedeutet "u", die zweite bedeutet "spielfrei" Es ist seltsam, dass auf den Apache-Seiten ein Hilfsprogramm angezeigt wird, das genau dieses Verhalten ausführt. In Wirklichkeit ist es jedoch Escape Mimic Utility . Apache hat ein eigenes Dienstprogramme (ich habe sie nicht getestet), die diese Arbeit für Sie erledigen. Vielleicht ist es immer noch nicht das, was Sie haben möchten. Apache Escape Unicode-Dienstprogramme Aber dieses Dienstprogramm 1 Gute Annäherung an die Lösung. Mit der oben beschriebenen Kombination (MeraNaamJoker). Meine Lösung besteht darin, diesen Escaped-Mimic-String zu erstellen und ihn dann wieder in Unicode umzuwandeln (um echte Escaped-Unicode-Einschränkungen zu vermeiden). Ich habe ihn zum Kopieren von Text verwendet. so ist es pos Möglicherweise ist es in der Uencode-Methode besser, '\\ u' zu verwenden, außer '\\\\ u'. Versuch es.

  /**
   * Converts character to the mimic unicode format i.e. '\\u0020'.
   * 
   * This format is the Java source code format.
   * 
   *   CharUtils.unicodeEscaped(' ') = "\\u0020"
   *   CharUtils.unicodeEscaped('A') = "\\u0041"
   * 
   * @param ch  the character to convert
   * @return is in the mimic of escaped unicode string, 
   */
  public static String unicodeEscaped(char ch) {
    String returnStr;
    //String uniTemplate = "\u0000";
    final static String charEsc = "\\u";

    if (ch < 0x10) {
      returnStr = "000" + Integer.toHexString(ch);
    }
    else if (ch < 0x100) {
      returnStr = "00" + Integer.toHexString(ch);
    }
    else if (ch < 0x1000) {
      returnStr = "0" + Integer.toHexString(ch);
    }
    else
      returnStr = "" + Integer.toHexString(ch);

    return charEsc + returnStr;
  }

  /**
   * Converts the string from UTF8 to mimic unicode format i.e. '\\u0020'.
   * notice: i cannot use real unicode format, because this is immediately translated
   * to the character in time of compiling and editor (i.e. netbeans) checking it
   * instead reaal unicode format i.e. '\u0020' i using mimic unicode format '\\u0020'
   * as a string, but it doesn't gives the same results, of course
   * 
   * This format is the Java source code format.
   * 
   *   CharUtils.unicodeEscaped(' ') = "\\u0020"
   *   CharUtils.unicodeEscaped('A') = "\\u0041"
   * 
   * @param String - nationalString in the UTF8 string to convert
   * @return is the string in Java unicode mimic escaped
   */
  public String encodeStr(String nationalString) throws UnsupportedEncodingException {
    String convertedString = "";

    for (int i = 0; i < nationalString.length(); i++) {
      Character chs = nationalString.charAt(i);
      convertedString += unicodeEscaped(chs);
    }
    return convertedString;
  }

  /**
   * Converts the string from mimic unicode format i.e. '\\u0020' back to UTF8.
   * 
   * This format is the Java source code format.
   * 
   *   CharUtils.unicodeEscaped(' ') = "\\u0020"
   *   CharUtils.unicodeEscaped('A') = "\\u0041"
   * 
   * @param String - nationalString in the Java unicode mimic escaped
   * @return is the string in UTF8 string
   */
  public String uencodeStr(String escapedString) throws UnsupportedEncodingException {
    String convertedString = "";

    String[] arrStr = escapedString.split("\\\\u");
    String str, istr;
    for (int i = 1; i < arrStr.length; i++) {
      str = arrStr[i];
      if (!str.isEmpty()) {
        Integer iI = Integer.parseInt(str, 16);
        char[] chaCha = Character.toChars(iI);
        convertedString += String.valueOf(chaCha);
      }
    }
    return convertedString;
  }
0
hariprasad