Как мне настроить выравнивание строк по китайским иероглифам в Java?

Следующий код предназначен для печати трех строк, в которых каждый символ '(' помещается на 11-ю позицию в соответствующей строке, обеспечивая вертикальное выравнивание символов '('.

        System.out.printf("%1$10s (%2$2s)\n", "孙悟空", 1);
        System.out.printf("%1$10s (%2$2s)\n", "唐僧", 2);
        System.out.printf("%1$10s (%2$2s)\n", "hello", 3);

Однако код не может их правильно выровнять из-за присутствия китайских иероглифов. Как можно решить эту проблему?

не обязательно использовать String.format(), любой другой Java API также приветствуется.

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

DuncG 05.05.2024 14:02

добавьте TAB \t перед (

user85421 05.05.2024 15:49

Связано, без ответа: stackoverflow.com/questions/52138083/… Я до сих пор не знаю ни одного систематического решения.

Andrey Tyukin 06.05.2024 00:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Текст не выглядит «выровненным», поскольку ширина символов не одинакова. Китайские иероглифы занимают больше места по горизонтали, чем другие иероглифы.

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

Это не будет работать с каждым кодом в Юникоде, но если вы работаете только с латинским алфавитом и китайскими символами, я бы предложил преобразовать все выходные данные String.format в символы полной ширины . Вы можете легко это сделать с помощью Transliterator от ICU4J.

Пример:

public static void main(String[] args) {
    var s1 = String.format("%1$10s (%2$2s)", "孙悟空", 1);
    var s2 = String.format("%1$10s (%2$2s)", "唐僧", 2);
    var s3 = String.format("%1$10s (%2$2s)", "hello", 3);
    System.out.println(toFullWidth(s1));
    System.out.println(toFullWidth(s2));
    System.out.println(toFullWidth(s3));
}

static String toFullWidth(String s) {
    Transliterator t = Transliterator.getInstance("Halfwidth-Fullwidth");
    return t.transliterate(s);
}

Выход:

       孙悟空 ( 1)
        唐僧 ( 2)
     hello ( 3)

Если вы считаете, что использовать ICU4J только для этого — это излишество, вы всегда можете жестко запрограммировать свой собственный Map<Character, Character> для нужных вам персонажей. См. список полноширинных символов в Википедии.

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