Следующий код предназначен для печати трех строк, в которых каждый символ '(' помещается на 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 также приветствуется.
добавьте TAB \t
перед (
Связано, без ответа: stackoverflow.com/questions/52138083/… Я до сих пор не знаю ни одного систематического решения.
Текст не выглядит «выровненным», поскольку ширина символов не одинакова. Китайские иероглифы занимают больше места по горизонтали, чем другие иероглифы.
Вероятно, это можно исправить, просто используя шрифт, который отображает все одинаковой ширины, хотя я не знаю такого шрифта.
Это не будет работать с каждым кодом в Юникоде, но если вы работаете только с латинским алфавитом и китайскими символами, я бы предложил преобразовать все выходные данные 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>
для нужных вам персонажей. См. список полноширинных символов в Википедии.
Количество пробелов правильное, но похоже, что у вашего отображаемого шрифта не фиксированная ширина каждого символа, поэтому они не будут совпадать на экране.