Самый простой способ преобразовать int (байт) в односимвольную строку в Java

У меня есть int (-> байт), представляющий действительный UTF-8 характер, и я хочу напечатать этот единственный символ в System.out.println,

Я знаю эти два способа преобразования int, представляющего байт UTF-8, в односимвольную строку:

int myByte = ...; // For example 67

String sMyByte = String.valueOf((char)((byte)myByte & 0xFF)); // 67 will become "C"

String sMyByte = new String(new byte[]{ (byte)myByte }, StandardCharsets.UTF_8); // 67 will become "C"

Оба кажутся немного длинными / нечитаемыми, и я хотел бы знать, есть ли более простой способ преобразовать int, представляющий байт UTF-8, в односимвольную строку. Если нет, я, вероятно, буду использовать первый из двух выше.

5 ответов

Решение

Вы не должны называть свой инт myByte; на самом деле это кодовая точка Unicode.

Самый простой способ для вас это использовать Character.toChars():

final String s = new String(Character.toChars(theCodePoint));

Он будет обрабатывать каждую точку кода; после этого все зависит от того, есть ли у используемого шрифта глиф для этой кодовой точки!

Также обратите внимание, что UTF-8 является кодировкой символов. На самом деле, у вас нет такой вещи как персонаж UTF-8.

Для дальнейшего расследования вы хотите взглянуть на CharsetEncoder а также CharsetDecoder классы.

Как насчет этого? .. Как говорит TJ Crowder, вам не нужно преобразовывать его в байт

public static void main(String[] args) {
    int mByte = 67;
    String s = String.valueOf((char)mByte);
    System.out.println(s);
}

O/P: C

Во-первых, мы должны сделать предположение: вы имеете дело только со значениями от 0 до 127, потому что это единственные символы UTF-8, которые могут быть представлены одной кодовой единицей UTF-8 (байт). Подробнее о UTF-8 и UTF-16 на сайте Unicode.org.

Исходя из этого предположения, мы полагаемся на тот факт, что первые 128 кодовых единиц UTF-8 (0x00 - 0x7F) точно соответствуют первым 128 кодовым единицам UTF-16 (0x0000 - 0x007F). Таким образом, мы можем рассматривать ваш ввод как единицу кода UTF-16, что важно, потому что это то, что есть в Java char представляет собой. Этот список и этот список на fileformat.info подтверждают, что первые 128 одинаковы.

Исходя из вышеизложенного, получаем:

if (myByte < 0 || myByte > 0x7F) {
    throw /*...relevant exception...*/;
}
String s = Character.toString(myByte);

Это будет называть Character.toString(char) метод, неявно приведенный myByte в charи вернуть строку, содержащую один символ со значением, интерпретированным в UTF-16.

Вы можете использовать Character.toChars() здесь

Например:

System.out.println(Character.toChars(67));

Выход:

C
int b = 67;
String s = "" + (char)b;
System.out.println(s);

Работает для меня.

Другие вопросы по тегам