Создание символа Юникода из его числа
Я хочу отобразить символ Юникода в Java. Если я это сделаю, он работает просто отлично:
String symbol = "u2202";
символ равен "∂". Вот чего я хочу.
проблема в том, что я знаю номер Юникода и должен создать символ Юникода из этого. Я попробовал (мне) очевидную вещь:
int c = 2202;
String symbol = "u" + c;
однако в этом случае символ равен "u2202". Это не то, чего я хочу.
Как я могу построить символ, если я знаю его Номер Unicode (но только во время выполнения- - - я не могу жестко закодировать его, как в первом примере)?
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[]
.
вот блок для печати символов Юникода между
\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