Создание символа Юникод из его номера - PullRequest
99 голосов
/ 07 апреля 2011

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

String symbol = "\u2202";

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

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

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

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

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

Ответы [ 13 ]

121 голосов
/ 08 апреля 2011

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

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

Док говорит:

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

65 голосов
/ 07 апреля 2011

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

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

EDIT:

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

19 голосов
/ 16 апреля 2013

Другие ответы здесь либо поддерживают только юникод до U + FFFF (ответы, касающиеся только одного экземпляра символа), либо не говорят, как добраться до действительного символа (ответы останавливаются на 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
5 голосов
/ 27 ноября 2013

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

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

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

5 голосов
/ 07 апреля 2011

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

char c = 0x2202;//aka 8706 in decimal. \u codepoints are in hex.
String s = String.valueOf(c);
3 голосов
/ 24 июля 2017
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'.
2 голосов
/ 26 сентября 2018

Хотя это старый вопрос, есть очень простой способ сделать это в 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

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

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

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

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

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

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

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

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

1 голос
/ 28 октября 2016

Вот блок для печати символов Юникода в диапазоне от \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();
}
1 голос
/ 10 июня 2015

Приведенный ниже код запишет 4 символа Юникода (представленные в десятичных числах) для слова «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
...