下面的代码旨在打印三个字符串,每个"("字符位于其各自行的第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);

enter image description here

然而,由于中文字符的存在,代码无法正确对齐它们.这个问题如何解决?

它不必使用String.format(),也欢迎使用任何其他Java API.

推荐答案

文本看起来不"对齐",因为字符的宽度不同.中文字符比其他字符占用更多的横向空间.

这个问题可能可以通过使用以相同宽度显示所有内容的字体来解决,尽管我不知道有这样的字体.

这不会适用于Unicode中的每个代码点,但如果您只使用拉丁字母和中文字符,我建议将String.format个输出转换为full width characters.您可以通过ICU4J中的Transliterator轻松做到这一点.

示例:

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)

如果您认为仅为此而使用ICU 4 J就有些过分了,那么您可以随时为您关心的字符硬编码自己的Map<Character, Character>.请参阅Wikipedia上的全宽字符列表.

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

将偶数元素移动到数组的前面,同时保持相对顺序

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

最小拓Flutter 排序的时间复杂度是多少?

Springdoc Whitelabel Error Page with Spring V3

计算两个浮点数之间的距离是否对称?

Spring Data JPA慢慢地创建了太多非活动会话

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

如何将其他属性引用到log4j2 yaml配置中?

Java连接池无法正常工作

使用存储在字符串变量中的路径目录打开.pdf文件

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

AWS Java SDK v2.x中没有setObjectAcl方法

具有多个模式的DateTimeForMatter的LocalDate.parse失败

Kotlin-仅替换字符串中最后一个给定的字符串

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

设置背景时缺少Android编辑文本下划线

Java方法参数:括号中的类型声明?