Обработка: как преобразовать тип данных char в его представление utf-8 int?

Как я могу преобразовать тип данных char в его представление utf-8 int в обработке?

Итак, если бы у меня был массив ['a', 'b', 'c'], я бы хотел получить другой массив [61, 62, 63].


person mpjan    schedule 22.05.2013    source источник
comment
Смотрите мое недавнее редактирование моего ответа.   -  person nico_c    schedule 22.05.2013
comment
пожалуйста, обновите свой пост, чтобы ваш вопрос соответствовал ответу, который вы искали. @nickecarlo указал, что вам действительно нужны шестнадцатеричные строки, пожалуйста, обновите свой вопрос соответствующим образом, чтобы люди, которые могут найти этот вопрос и ответ в будущем, не были сбиты с толку тем, что ответ на самом деле является ответом на вопрос, отличный от того, что вы перечислили здесь.   -  person Mike 'Pomax' Kamermans    schedule 25.05.2013


Ответы (2)


После моего ответа я придумал гораздо более простой и прямой способ преобразования в нужные вам типы чисел. То, что вы хотите для «а», — это 61 вместо 97 и так далее. Это не очень сложно, учитывая, что 61 — это шестнадцатеричное представление десятичного числа 97. Поэтому все, что вам нужно сделать, это передать свой char в определенный метод, например:

Integer.toHexString((int)'a');

Если у вас есть массив таких символов:

char[] c = {'a', 'b', 'c', 'd'};

Затем вы можете использовать вышеизложенное таким образом:

Integer.toHexString((int)c[0]);

и так далее и тому подобное.

ИЗМЕНИТЬ

В соответствии с примером vk в комментариях ниже, вы можете сделать следующее в обработке:

char c = 'a';

Вышеприведенное даст вам шестнадцатеричное представление символа в виде строки.

// to save the hex representation as an int you need to parse it since hex() returns a String
int hexNum = PApplet.parseInt(hex(c));

// OR

int hexNum = int(c);

В интересах ОП и комментатора ниже. Вы получите 97 для «а», даже если вы использовали мое предыдущее предложение в ответе, потому что 97 — это десятичное представление шестнадцатеричного 61. Видя, что UTF-8 соответствует первым 127 значениям записей ASCII для значения, я не понимаю, почему в любом случае можно было бы ожидать чего-то другого. Что касается исключения UnsupportedEncodingException, простым исправлением будет помещение операторов в блок try/catch. Однако в этом нет необходимости, поскольку приведенное выше прямо отвечает на вопрос гораздо проще.

person nico_c    schedule 22.05.2013
comment
Этот код выдает мне UnsupportedEncodingException... При обработке, знаете почему? Эта другая версия работает, но по-прежнему дает мне 97, 98, 99, 100. Не 61, 62, 63, 64... import java.nio.charset.*; Кодировка utf = Charset.forName(UTF-8); Строка с = abcd; байт [] б = s.getBytes (utf); распечатать(б); - person v.k.; 22.05.2013
comment
С точки зрения обработки можно было бы сказать: char c = 'a'; println(hex(int(c))); - person v.k.; 23.05.2013
comment
@в.к. Спасибо, я обновлю свой ответ. Это обратная сторона перехода к обработке с Java. Трудно отказаться от Java. - person nico_c; 23.05.2013
comment
Хорошо, он возвращает строку, так что вы можете сделать: char c = 'a'; println(int(hex(c))); и получить int :) Но в любом случае я думаю, что это одно из преимуществ обработки, вы можете просто добавить немного java, когда это необходимо. Почему нет? Ах, и в коде вашего редактирования отсутствует вторая строка. - person v.k.; 23.05.2013
comment
@в.к. Я уже предоставил код, который вы использовали бы для преобразования String в int в ответе. - person nico_c; 23.05.2013
comment
Я видел, но я просто указал, что вам не нужно использовать Integer.parseInt(). Вы можете просто использовать int() Processing :) - person v.k.; 23.05.2013
comment
@в.к. добавил его в ответ. Я больше не буду обновлять этот ответ. Я думаю, что ОП уже получил достаточно помощи. - person nico_c; 23.05.2013
comment
это излишне сложный ответ =) Если у нас есть chars, они уже являются числовым типом и могут быть преобразованы в соответствующее число с помощью приведения типов (int) (помните, что char — это 16-битный целочисленный тип без знака, такой как int, и в отличие от String) - person Mike 'Pomax' Kamermans; 25.05.2013
comment
@Mike'Pomax'Kamermans Вероятно, следовало прочитать, что он не хочет прямого преобразования в значения int, а в их шестнадцатеричный эквивалент. Было бы хорошо, если бы это был новый вопрос, если бы это был новый вопрос, но это не так. Поэтому я отрицаю ваш ответ. - person nico_c; 25.05.2013
comment
Что касается сложности, я редактирую предыдущее (связанное с Java) решение, которое больше не применимо. - person nico_c; 25.05.2013
comment
справедливо. Я также оставлю это здесь: processing.org/reference/hex_.html (кстати, в ОП вообще не упоминается шестнадцатеричный код Я не читал этот полный обмен комментариями, поэтому, пожалуйста, не минусуйте меня за то, что я не знаю чего-то на основе информации, отсутствующей в ОП, которая по-прежнему показывает десятичные значения =) - person Mike 'Pomax' Kamermans; 25.05.2013
comment
@Mike'Pomax'Kamermans Я не понизил голос, потому что вы не читали комментарии, я понизил голос, потому что в вопросе четко указано, что он ищет что-то, что дает ему a = 61, b = 62 и т. д. Если вы просмотрите документацию для UTF-8, вы увидите, как они это представляют. Новичкам сложно понять, что 61 — это шестнадцатеричное значение для 97 в десятичном виде. Что касается вашей ссылки на обработку функции hex(), это уже было частью моего ответа, поэтому не уверен, что нужно повторять это здесь. - person nico_c; 26.05.2013
comment
@Mike'Pomax'Kamermans, что касается вашего ответа и отрицательного голоса, я бы вернул его (если еще могу), если вы действительно ответите на вопрос, который спрашивает, как получить шестнадцатеричные значения в int. Например: как я могу преобразовать тип данных char в его представление utf-8 int в обработке, четко задан вопрос. - person nico_c; 26.05.2013

что вы имеете в виду "utf-8 int"? UTF8 — это многобайтовая схема кодирования букв (технически глифов), представленных в виде чисел Unicode. В вашем примере вы используете тривиальные буквы из набора ASCII, но этот набор имеет очень мало общего с реальным вопросом unicode/utf8.

Для простых букв вы можете буквально просто ввести:

print((int)'a') -> 97
print((int)'A') -> 65

Но вы не можете сделать это с символами за пределами 16-битного диапазона символов. print((int)'二') работает (дает 20108 или 4E8C в шестнадцатеричном формате), но print((int)'????') выдаст ошибку компиляции, потому что код символа для ???? не помещается в 16 бит (предполагается, что это 131362 или 20122 в шестнадцатеричном формате, который кодируется как трехбайтный последовательность UTF-8 239+191+189)

Таким образом, для символов Unicode с кодом выше 0xFFFF вы не можете использовать приведение типов int, и вам действительно придется хорошенько подумать о том, что вы декодируете. Если вам нужны истинные значения точек Unicode, вам придется буквально декодировать печать байтов, но Processing IDE на самом деле не позволяет вам это делать; он скажет вам, что "????".length() равно 1, тогда как в реальной Java это на самом деле 3. В текущей обработке нет способа фактически получить значение Unicode для любого символа с кодом выше, чем 0xFFFF.

обновить

Кто-то упомянул, что вам действительно нужны шестнадцатеричные строки. Если это так, используйте встроенную функцию hex.

println(hex((int)'a')) -> 00000061

и если вам нужны только 2, 4 или 6 символов, просто используйте подстроку:

println(hex((int)'a').substring(4)) -> 0061
person Mike 'Pomax' Kamermans    schedule 25.05.2013