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


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

String symbol = "u2202";

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

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

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

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

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

13 88

13 ответов:

просто закидываете int до char. Вы можете преобразовать это в String используя Character.toString():

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

EDIT:

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

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

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

доктор сказал:

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

другие ответы здесь либо поддерживают только unicode до U+FFFF (ответы, касающиеся только одного экземпляра char), либо не говорят, как добраться до фактического символа (ответы останавливаются на символе.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

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

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

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

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

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

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

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

данное решение is by Arne Vajhøj.

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 символа Юникода (представленные десятичными знаками) для слова "be" на японском языке. Да, глагол "быть" в японском языке имеет 4 символов! Значение символов находится в десятичной системе счисления и считывается в массив String[] -- например, с помощью split. Если у вас есть Восьмеричный или шестнадцатеричный,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

к сожалению, чтобы удалить один люфт, как упоминалось в первом комментарии (newbiedoodle) не приводят к хорошему результату. Большинство (если не все) IDE выдает синтаксическую ошибку. Причина в том, что Java Escape Unicode format ожидает синтаксис "\uXXXX", где XXXX-это 4 шестнадцатеричные цифры, которые являются обязательными. Попытки сложить эту строку из кусочков терпят неудачу. Конечно, "\у" не совпадает с "\\у". Первый синтаксис означает экранированный "u", второй означает экранированный люфт (который является люфтом), за которым следует "u". Оно странно, что на страницах Apache представлена утилита, которая делает именно такое поведение. Но на самом деле, это избежать мимических коммунальной. Apache имеет некоторые свои собственные утилиты (я не тестировал их), которые делают эту работу для вас. Может быть, это еще не то, что вы хотите иметь. Apache Escape Unicode utilities но эта утилита 1 есть хороший подход к решению. С комбинацией, описанной выше (MeraNaamJoker). Мое решение-создать этот экранированный имитируйте строку, а затем преобразуйте ее обратно в 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;
  }

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

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

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

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

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

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

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

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

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

Я из Западной Бенгалии в Индии. Как я понимаю ваша проблема ... Вы хотите создать похожий на ' অ '(это буква на бенгальском языке) который имеет шестнадцатеричный код Юникода:0X0985.

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

в Dot Net это так просто, как это :

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

теперь X-это ваш ответ. Но это шестнадцатеричное преобразование, а преобразование предложения в предложение-это работа для исследователей: P