Создание символа Юникода из его номера

Я хочу отобразить символ Unicode в Java. Если я это сделаю, все будет хорошо:

String symbol = "\u2202";

символ равен "∂". Это то, что я хочу.

Проблема в том, что я знаю номер Юникода и мне нужно создать символ Юникода. Я пробовал (мне) очевидную вещь:

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

Однако в этом случае символ равен "\ u2202". Это не то, что я хочу.

Как я могу построить символ, если я знаю его номер Юникода (но только во время выполнения --- я не могу его жестко записать в первом примере)?

Ответ 1

Просто введите int в char. Вы можете преобразовать его в String с помощью Character.toString():

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

EDIT:

Просто помните, что escape-последовательности в исходном коде Java (бит \u) находятся в HEX, поэтому, если вы пытаетесь воспроизвести escape-последовательность, вам понадобится что-то вроде int c = 0x2202.

Ответ 2

Если вы хотите получить кодированный код кода UTF-16 как char, вы можете разобрать целое число и передать его, как предложили другие.

Если вы хотите поддерживать все кодовые точки, используйте Character.toChars(int). Это будет обрабатывать случаи, когда кодовые точки не могут вписываться в одно значение char.

Док говорит:

Преобразует указанный символ (кодовая точка Юникода) в его представление UTF-16, хранящееся в массиве char. Если указанная кодовая точка является значением BMP (Basic Multilingual Plane или Plane 0), результирующий массив char имеет то же значение, что и codePoint. Если указанная кодовая точка является дополнительной кодовой точкой, результирующий массив char имеет соответствующую суррогатную пару.

Ответ 3

Другие ответы здесь либо поддерживают только unicode до U + FFFF (ответы, относящиеся только к одному экземпляру char), либо не сообщают, как добраться до фактического символа (ответы останавливаются на Character.toChars( ) или с использованием некорректного метода после этого), поэтому добавление моего ответа здесь тоже.

Чтобы поддерживать дополнительные кодовые точки, это то, что нужно сделать:

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

Я также быстро проверил, какие методы преобразования работают, а какие

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

Ответ 4

Помните, что char является интегральным типом и поэтому может быть задано целочисленное значение, а также константа char.

char c = 0x2202;//aka 8706 in decimal. \u codepoints are in hex.
String s = String.valueOf(c);

Ответ 5

Это работало отлично для меня.

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

Теперь text2 будет иметь.

Ответ 6

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'.

Ответ 7

Вот как вы это делаете:

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

Это решение от Arne Vajhøj.

Ответ 8

Хотя это старый вопрос, в Java 11, который был выпущен сегодня, есть очень простой способ сделать это: вы можете использовать новую перегрузку Character.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

Поскольку этот метод поддерживает любую кодовую точку Unicode, длина возвращаемой строки не обязательно равна 1.

Код, необходимый для примера, приведенного в вопросе, просто:

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

Этот подход предлагает несколько преимуществ:

  • Он работает для любой кодовой точки Unicode, а не только для тех, которые могут быть обработаны с помощью char.
  • Это сжато и легко понять, что делает код.
  • Он возвращает значение в виде строки, а не char[], что часто является тем, что вы хотите. Ответ, опубликованный Макдауэллом, подходит, если вы хотите, чтобы кодовая точка была возвращена как char[].

Ответ 9

В приведенном ниже коде будут записаны четыре символа unicode (представленные десятичными знаками) для слова "be" на японском языке. Да, глагол "быть" на японском языке имеет 4 символа! Значение символов находится в десятичной форме и оно считывается в массив String [] - например, с использованием split. Если у вас есть Octal или Hex, parseInt возьмите радиус.

// 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

Ответ 10

К сожалению, удалить один ответ, упомянутый в первом комментарии (newbiedoodle), не приведет к хорошему результату. Большинство (если не все) IDE вызывают синтаксическую ошибку. Причина в том, что Java Escapeed Unicode формат ожидает синтаксиса "\ uXXXX", где XXXX - это четыре шестнадцатеричных цифры, которые являются обязательными. Попытки свернуть эту строку из кусков не удаются. Конечно, "\ u" не совпадает с "\\ u". Первый синтаксис означает "u", второй означает экранированный люфт (который представляет собой люфт), за которым следует "u". Странно, что на страницах Apache представлена ​​утилита, которая выполняет именно это поведение. Но на самом деле это Escape mimic utility. У Apache есть свои собственные утилиты (я их не тестировал), которые делают это для вас. Может быть, это все еще не так, что вы хотите иметь. Утилиты Apache Escape Unicode Но эта утилита 1 имеет хорошие подход к решению. С комбинацией, описанной выше (MeraNaamJoker). Мое решение - создать эту Escaped mimic строку, а затем преобразовать ее обратно в unicode (чтобы избежать реального ограничения Unicode). Я использовал его для копирования текста, поэтому возможно, что в методе uencode лучше использовать '\\ u', кроме '\\\\ u'. Попробуйте.

  /**
   * 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;
  }

Ответ 11

Вот блок для печати символов unicode между \u00c0 и \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();
}

Ответ 12

char c = (char) 0x2202; Строка s = "" + c;

Ответ 13

(ANSWER IS IN DOT NET 4.5 и в java, должен существовать аналогичный подход)

Я из Западной Бенгалии в Индии. Насколько я понимаю, ваша проблема... Вы хотите создать похожий на "অ" (это письмо на бенгальском языке) который имеет Unicode HEX: 0X0985.

Теперь, если вы знаете это значение в отношении своего языка, то как вы производите правильный символ Unicode на этом языке?

В Dot Net это так просто:

int c = 0X0985;
string x = Char.ConvertFromUtf32(c);

Теперь x - ваш ответ. Но это HEX путем преобразования HEX и предложения в предложение преобразования - это работа для исследователей: P