Самый простой способ преобразовать 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);
Работает для меня.