Как я могу получить код символа Unicode? - PullRequest
61 голосов
/ 05 января 2010

Допустим, у меня есть это:

char registered = '®';

или umlaut, или любой другой символ Юникода. Как я мог получить его код?

Ответы [ 6 ]

103 голосов
/ 05 января 2010

Просто конвертируйте его в int:

char registered = '®';
int code = (int) registered;

На самом деле существует неявное преобразование из char в int, поэтому вам не нужно указывать его явно, как я это делал выше, но я бы сделал это в этом случае, чтобы сделать очевидным, что вы пытаюсь сделать.

Это даст кодовую единицу UTF-16, которая совпадает с кодовой точкой Unicode для любого символа, определенного в базовой многоязычной плоскости. (И только символы BMP могут быть представлены как char значения в Java.) Как говорит ответ Анджея Дойла, если вы хотите, чтобы код Unicode содержал произвольную строку, используйте Character.codePointAt().

Как только вы получите кодовую единицу UTF-16 или кодовые точки Unicode, но из которых целые числа, вам решать, что вы будете делать с ними. Если вы хотите строковое представление, вам нужно решить, какой именно вид представления вы хотите. (Например, если вы знаете, что значение всегда будет в BMP, вам может потребоваться фиксированное четырехзначное шестнадцатеричное представление с префиксом U+, например, "U+0020" для пробела.) Это выходит за рамки этого вопроса, так как мы не знаем, каковы требования.

33 голосов
/ 05 января 2010

Более полный, хотя и более подробный, способ сделать это - использовать метод Character.codePointAt . Это будет обрабатывать символы «высокого суррогата», которые не могут быть представлены одним целым числом в диапазоне, который может представлять char.

В приведенном вами примере это не является строго необходимым - если символ (Unicode) может помещаться внутри единственной (Java) char (такой как локальная переменная registered), то он должен попадать в * Диапазон от 1008 * до \uffff, и вам не нужно беспокоиться о суррогатных парах. Но если вы смотрите на потенциально более высокие кодовые точки из массива String / char, то вызов этого метода целесообразен для того, чтобы охватить крайние случаи.

Например, вместо

String input = ...;
char fifthChar = input.charAt(4);
int codePoint = (int)fifthChar;

использование

String input = ...;
int codePoint = Character.codePointAt(input, 4);

Мало того, что этот код немного меньше в этом случае, но он будет обрабатывать обнаружение суррогатных пар для вас.

7 голосов
/ 15 апреля 2013

В Java char технически является "16-разрядным целым числом", поэтому вы можете просто привести его к int и получить его код. От Oracle :

Тип данных char - это один 16-битный символ Unicode. Оно имеет минимальное значение «\ u0000» (или 0) и максимальное значение «\ uffff» (или 65 535 включительно).

Так что вы можете просто привести его к int.

char registered = '®';
System.out.println(String.format("This is an int-code: %d", (int) registered));
System.out.println(String.format("And this is an hexa code: %x", (int) registered));
0 голосов
/ 29 мая 2018

Существует библиотека с открытым исходным кодом MgntUtils, у которой есть служебный класс StringUnicodeEncoderDecoder. Этот класс предоставляет статические методы, которые преобразуют любую строку в последовательность Unicode, наоборот. Очень просто и полезно. Чтобы конвертировать String, вы просто делаете:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(myString);

Например, строка «Hello World» будет преобразована в

"\ u0065 \ u006c \ u006f \ u0020 \ u006f \ u0072 \ u006c \ u0064"

Работает с любым языком. Вот ссылка на статью, которая объясняет все подробности о библиотеке: MgntUtils . Посмотрите на подзаголовок "String Unicode Converter". Статья дает вам ссылку на Maven Central, где вы можете получить артефакты и GitHub, где вы можете получить сам проект. Библиотека поставляется с хорошо написанным Javadoc и исходным кодом.

0 голосов
/ 21 июля 2015

Для меня только "Integer.toHexString (зарегистрирован)" работал так, как я хотел:

char registered = '®';
System.out.println("Answer:"+Integer.toHexString(registered));

Этот ответ даст вам только строковые представления, которые обычно представлены в таблицах. Ответ Джона Скита объясняет больше.

0 голосов
/ 06 января 2010

Дорогой друг, Джон Скит сказал, что вы можете найти символьный десятичный код, но это не символьный шестнадцатеричный код, как следует упомянуть в юникоде, поэтому вы должны представлять коды символов через шестнадцатеричный код, а не в Deciaml.

есть инструмент с открытым исходным кодом на http://unicode.codeplex.com, который предоставляет полную информацию о персонаже или предложении.

так что лучше создать парсер, который даст char в качестве параметра и вернет ahexCode в виде строки

public static String GetHexCode(char character)
    {
        return String.format("{0:X4}", GetDecimal(character));
    }//end

надеюсь, что это поможет

...